Các ràng buộc khóa ngoại hiện đang được thực hiện với các kích hoạt nội bộ đặc biệt. Tất cả đều được chạy FOR EACH ROW
.
Lưu ý rằng đây là những chi tiết triển khai có thể thay đổi, vì vậy đừng dựa vào nó. Nhưng những điều cơ bản không thay đổi trong vài phiên bản chính cuối cùng, vì vậy những thay đổi lớn là không thể.
Tôi đã chạy thử nghiệm nhanh với một ràng buộc FK đơn giản từ tbl
đến tbltype
. Một FK đơn giản được triển khai với bốn kích hoạt bên trong đơn giản FOR EACH ROW
trong thử nghiệm của tôi trên trang 9,4.
Dưới đây là tóm tắt nhanh về cách điều tra:
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'
Hai kích hoạt "không hoạt động" nội bộ trên tbltype
.
Hai kích hoạt "kiểm tra" nội bộ trên tbl
.
Tất cả chúng đều được chạy FOR EACH ROW
, như được chỉ định bởi các số lẻ trong tgtype
.
2 byte của Postgres tgtype smallint
đại diện cho một int16
mã nguồn C trong đó mã hóa bit ít quan trọng nhất TRIGGER_TYPE_ROW
. Giải thích chi tiết tại đây:
Bạn có thể dễ dàng kiểm tra điều này với một cặp kích hoạt giống hệt nhau mà bạn chỉ thay đổi FOR ROW
/ STATEMENT
...