问题 SET约束所有DEFERRED在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 没有达到预期的效果?

错误:表“b”上的插入或更新违反了外键约束   “fkey_ij”
  SQL状态:23503详细信息:表“a”中不存在键(j)=(2)。


7838
2018-02-23 18:32


起源

对于例如您的情况的替代解决方案恢复备份将禁用触发器。看到: stackoverflow.com/q/3942258/1157054 - Ajedi32


答案:


仅限初学者 DEFERRABLE 约束可以推迟。

但这对你的情况没有帮助,因为FK约束不能这样弯曲 一点都不每个文档

除了以外的参考行动 NO ACTION 检查不能推迟,   即使约束被声明为可延迟的。

颠倒你的序列 INSERT 声明。

有关:


10
2018-02-23 18:55



如果外键约束不能 曾经 受到影响 SET CONSTRAINTS,为什么然后做文档 SET CONSTRAINTS 州:“目前,只有UNIQUE,PRIMARY KEY, 参考文献(外键),EXCLUDE约束受此设置的影响“? postgresql.org/docs/current/static/sql-set-constraints.html - Ajedi32
没关系,想通了。他们可能会受到影响,但前提是你没有使用过 ON UPDATE, 要么 ON DELETE 在这种情况下OP的行动。 - Ajedi32