PostgreSQL不支持任何配置選項,但有另一種可能性。
postgres=# \d b
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Postgres中的參照完整性由觸發器實現,您可以在表上禁用觸發器。使用這種方法,您可以上傳任何數據(風險),但速度明顯更快 - 因爲檢查大數據的代價很高。如果你的上傳是安全的,那麼你可以做到。
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
下一種可能性是使用延遲約束。此移動約束檢查提交時間。所以,你應該不尊重秩序與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".
這種方法應該是首選的你,因爲插入的數據將被檢查。