PostgreSQL không hỗ trợ bất kỳ tùy chọn cấu hình nào, nhưng có khả năng khác.
postgres=# \d b
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Tính toàn vẹn tham chiếu trong Postgres được thực hiện bởi trình kích hoạt và bạn có thể tắt trình kích hoạt trên bảng. Với phương pháp này bạn có thể tải lên bất kỳ dữ liệu (rủi ro), nhưng nó là nhanh hơn đáng kể - bởi vì việc kiểm tra dữ liệu lớn là tốn kém. Và nếu tải lên của bạn an toàn thì bạn có thể thực hiện.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Khả năng tiếp theo đang sử dụng hạn chế hoãn lại. Điều này hạn chế di chuyển kiểm tra để cam kết thời gian. Vì vậy, bạn không nên tôn trọng trật tự với các lệnh INSERT
:
ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;
BEGIN
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED;
SET CONSTRAINTS
postgres=# INSERT INTO b VALUES(100); -- this is not in a table
INSERT 0 1
postgres=# INSERT INTO b VALUES(10);
INSERT 0 1
postgres=# COMMIT;
ERROR: insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL: Key (id)=(100) is not present in table "a".
Phương pháp này sẽ được ưu tiên hơn vì dữ liệu được chèn sẽ được kiểm tra.
Nguồn
2016-06-30 04:08:40