Batasan kunci asing saat ini diimplementasikan dengan pemicu internal khusus. Semuanya dijalankan FOR EACH ROW.
Perhatikan bahwa ini adalah detail implementasi yang dapat berubah, jadi jangan bergantung padanya. Tetapi dasar-dasarnya tidak berubah selama beberapa versi utama terakhir, jadi perubahan besar tidak mungkin.
Saya menjalankan tes cepat dengan batasan FK sederhana dari tblke tbltype. FK sederhana diimplementasikan dengan empat pemicu internal sederhana FOR EACH ROWdalam pengujian saya di hal 9.4.
Berikut ini ikhtisar singkat tentang cara menyelidiki:
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'
Dua "noaksi" internal terpicu tbltype.
Dua "cek" internal diaktifkan tbl.
Semuanya dijalankan FOR EACH ROW, seperti yang ditunjukkan oleh angka ganjil di tgtype.
2 byte Postgres tgtype smallintmewakili int16kode sumber C di mana bit paling sedikit dikodekan TRIGGER_TYPE_ROW. Penjelasan terperinci di sini:
Anda dapat dengan mudah menguji ini dengan sepasang pemicu identik di mana Anda hanya mengubah FOR ROW/ STATEMENT...