11

Wenn ich Tabellen definieren a und b wie folgt:SET CONSTRAINTS ALL ABGEGRENZTE nicht wie erwartet funktioniert in 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); 

Und dann wie folgt vor:

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

Es produziert die folgenden Fehler. Warum hat SET CONSTRAINTS nicht den gewünschten Effekt?

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

Eine alternative Lösung für Fälle, in denen Sie zum Beispiel sind Das Wiederherstellen eines Backups würde Trigger deaktivieren. Siehe: http://StackOverflow.com/Q/3942258/1157054 – Ajedi32

Antwort

11

Zunächst können nur DEFERRABLE Constraints zurückgestellt werden.

Aber das wird Ihrem Fall nicht helfen, weil FK-Einschränkungen nicht auf diese Weise überhaupt verbogen werden können. Per documentation:

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

die Reihenfolge Ihrer INSERT Aussagen umkehren.

Verwandte:

+1

Wenn Fremdschlüsseleinschränkungen _ever_ nicht durch 'SET CONSTRAINTS' beeinflusst werden können, warum sollte dann die Dokumentation für' SET CONSTRAINTS' lauten: "Momentan nur EINZIGARTIG, PRIMARY KEY, ** REFERENCES (Fremdschlüssel) ** und EXCLUDE-Einschränkungen sind von dieser Einstellung betroffen "? http://www.postgresql.org/docs/current/static/sql-set-constraints.html – Ajedi32

+1

Nevermind, fand es heraus. Sie können betroffen sein, aber nur, wenn Sie nicht die Aktionen 'ON UPDATE' oder 'ON DELETE' verwenden, die das OP in diesem Fall ist. – Ajedi32

Verwandte Themen