11

如果我定義表ab如下:SET約束的遞延未正常工作中的PostgreSQL 9.3

CREATE TABLE a(i integer); 
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i); 
CREATE TABLE b(j integer); 
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j) 
     REFERENCES a (i) MATCH SIMPLE 
     ON UPDATE CASCADE ON DELETE CASCADE; 
INSERT INTO a(i) VALUES(1); 

然後執行以下操作:

START TRANSACTION; 
SET CONSTRAINTS ALL DEFERRED; 
INSERT INTO b(j) VALUES(2); 
INSERT INTO a(i) VALUES(2); 
COMMIT; 

它產生下面的錯誤。爲什麼SET CONSTRAINTS沒有達到預期效果?

ERROR: insert or update on table "b" violates foreign key constraint "fkey_ij"
SQL state: 23503 Detail: Key (j)=(2) is not present in table "a".

+0

爲您需要例如箱子另一種解決方案恢復備份將禁用觸發器。請參閱:http://stackoverflow.com/q/3942258/1157054 – Ajedi32 2016-04-08 16:13:17

回答

11

對於初學者,只有DEFERRABLE約束可以推遲。

但這不會幫助你的情況,因爲,FK限制不能彎曲這種方式在所有Per documentation

Referential actions other than the NO ACTION check cannot be deferred, even if the constraint is declared deferrable.

反向您INSERT語句序列。

相關:

+1

如果外鍵約束不能受SET CONSTRAINTS影響,那麼爲什麼要爲SET CONSTRAINTS狀態創建文檔:「目前,只有UNIQUE, PRIMARY KEY,** REFERENCES(外鍵)**和EXCLUDE約束受此設置影響「? http://www.postgresql.org/docs/current/static/sql-set-constraints.html – Ajedi32 2016-04-08 15:57:52

+1

沒關係,算出來。它們可能會受到影響,但前提是您不使用「ON UPDATE」或「ON DELETE」操作,在這種情況下OP就是這樣。 – Ajedi32 2016-04-08 16:08:30