Я понимаю, что триггер в таблице t, определенной с помощью, FOR EACH STATEMENT
будет запущен один раз, когда я выполню UPDATE t ...
.
Теперь, когда t
определено с помощью FOREIGN KEY ... REFERENCES a ... ON UPDATE CASCADE
, и я обновляю N строк a
, вызовет ли триггер вызов один раз или N раз?
Другими словами, являются ли изменения в таблице, каскадные ограничением FK, более похожими на одиночную UPDATE
или более на серию UPDATE
s?
postgresql
trigger
foreign-key
postgresql-9.2
Ханно Фиц
источник
источник
FOR EACH STATEMENT
в главном предложении ортогонально остальной части вопроса. Ограничения FK реализуются с помощью специальных триггеровFOR EACH ROW
.Ответы:
Ограничения внешнего ключа в настоящее время реализуются с помощью специальных внутренних триггеров. Все они запущены
FOR EACH ROW
.Обратите внимание, что это детали реализации, которые могут измениться, поэтому не полагайтесь на это. Но основы не изменились за последние пару основных версий, поэтому серьезные изменения маловероятны.
Я провел быстрый тест с простым ограничением FK от
tbl
доtbltype
. Простой FK реализован с четырьмя простыми внутренними триггерамиFOR EACH ROW
в моем тесте на стр. 9.4.Вот краткое изложение того, как исследовать:
Два внутренних «noaction» запускаются
tbltype
.Два внутренних «проверки» запускаются
tbl
.Все они запускаются
FOR EACH ROW
, как указано нечетными числами вtgtype
.2 байта Postgres
tgtype smallint
представляютint16
исходный код на C, где кодируется младший значащий битTRIGGER_TYPE_ROW
. Подробное объяснение здесь:Вы можете легко проверить это с парой идентичных триггеров, где вы только меняете
FOR ROW
/STATEMENT
...источник
Он выполняется N раз, и самый простой способ убедиться в этом - выполнить оператор с
EXPLAIN ANALYZE
добавлением, то естьЭто даст вам информацию, подобную этой:
Trigger for constraint t_col_fk on a: time=1.300 calls=9
(протестировано с 9.2)
источник