11

Nếu tôi xác định các bảng ab như sau:Ràng buộc SET ALL HOÃN không làm việc như mong đợi trong 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); 

Và sau đó làm như sau:

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

Nó tạo ra những lỗi dưới đây. Tại sao SET CONSTRAINTS không có hiệu ứng mong muốn?

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

Một giải pháp thay thế cho trường hợp bạn ví dụ khôi phục bản sao lưu sẽ là tắt trình kích hoạt. Xem: http://stackoverflow.com/q/3942258/1157054 – Ajedi32

Trả lời

11

Để bắt đầu, chỉ có thể trì hoãn DEFERRABLE.

Nhưng điều đó sẽ không giúp ích cho trường hợp của bạn vì, các ràng buộc FK không thể bị bẻ cong theo cách này ở tất cả. Per documentation:

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

Đảo ngược chuỗi các tuyên bố INSERT của bạn.

liên quan:

+1

Nếu các ràng buộc khóa ngoài không thể _ever_ bị ảnh hưởng bởi 'SET CONSTRAINTS', tại sao sau đó thực hiện các tài liệu cho trạng thái' SET CONSTRAINTS': "Hiện tại, chỉ UNIQUE, PRIMARY KEY, ** CÁC TÀI LIỆU THAM KHẢO (khóa ngoại) ** và EXCLUDE bị ảnh hưởng bởi cài đặt này "? http://www.postgresql.org/docs/current/static/sql-set-constraints.html – Ajedi32

+1

Không bao giờ, đã tìm ra. Chúng có thể bị ảnh hưởng, nhưng chỉ khi bạn không sử dụng các hành động 'ON UPDATE' hoặc' ON DELETE', thì OP trong trường hợp này là. – Ajedi32

Các vấn đề liên quan