外部キー制約は現在、特別な内部トリガーで実装されています。それらのすべてが実行されFOR EACH ROW
ます。
これらは変更される可能性のある実装の詳細であるため、それに依存しないでください。しかし、基本は最近のいくつかのメジャーバージョンで変更されていないため、メジャーな変更はほとんどありません。
からtbl
までの単純なFK制約を使用して簡単なテストを実行しましたtbltype
。単純なFKはFOR EACH ROW
、pg 9.4のテストで4つの単純な内部トリガーを使用して実装されています。
調査方法の簡単な概要は次のとおりです。
SELECT oid -- 74791
FROM pg_constraint
WHERE conrelid = 'tbl'::regclass
AND contype = 'f';
SELECT objid, classid::regclass -- 74792,74793,74794,74795 / 'pg_trigger'
FROM pg_depend
WHERE refobjid = 74791
AND deptype = 'i'
SELECT tgrelid::regclass, tgname, tgfoid, tgtype FROM pg_trigger
WHERE oid IN (74792,74793,74794,74795) ORDER BY tgfoid;
'tbl' ;'RI_ConstraintTrigger_c_74794';1644;5
'tbl' ;'RI_ConstraintTrigger_c_74795';1645;17
'tbltype';'RI_ConstraintTrigger_a_74792';1654;9
'tbltype';'RI_ConstraintTrigger_a_74793';1655;17
SELECT oid, proname FROM pg_proc
WHERE oid IN (1654,1655,1644,1645);
1644;'RI_FKey_check_ins'
1645;'RI_FKey_check_upd'
1654;'RI_FKey_noaction_del'
1655;'RI_FKey_noaction_upd'
の2つの内部「noaction」トリガーtbltype
。
の2つの内部「チェック」トリガーtbl
。
のFOR EACH ROW
奇数で示されているように、それらすべてが実行されますtgtype
。
Postgresの2バイトは、最下位ビットがエンコードするCのソースコードをtgtype smallint
表します。詳細な説明はこちら:int16
TRIGGER_TYPE_ROW
変更するだけで、同じトリガーのペアでこれを簡単にテストできますFOR ROW
/ STATEMENT
...