【发布时间】:2015-04-25 04:36:15
【问题描述】:
在 PostgreSQL 9.3 数据库中,如果我定义表 a 和 b 如下:
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".
【问题讨论】:
-
另一种解决方案,适用于您的情况,例如恢复备份将禁用触发器。见:stackoverflow.com/q/3942258/1157054
标签: sql postgresql database-design foreign-keys referential-integrity