【发布时间】:2011-02-28 21:53:46
【问题描述】:
情况是这样的:我有两个表,其中一个引用另一个(例如,table2 引用 table1)。在创建这些表时,我确实将外键约束设置为 DEFERRABLE,并将 ON UPDATE 和 ON DELETE 子句设置为 NO ACTION(这是默认设置)。
但是,在运行下面的事务时,我仍然收到以下错误。
交易:
START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
UPDATE table1 SET blah blah;
UPDATE table2 SET blah blah;
COMMIT;
错误:
ERROR: update or delete on table "table1" violates foreign key constraint "table1_column_fkey" on table "table2"
DETAIL: Key (column1)=(blahblah) is still referenced from table "table2".
和表构造:
CREATE TABLE table1(
column1 CHAR(10),
[...]
PRIMARY KEY (column1)
);
CREATE TABLE table2(
primkey CHAR(9),
[...]
column2 CHAR(10) NOT NULL,
PRIMARY KEY(primkey),
FOREIGN KEY(column2) REFERENCES table1(column1) DEFERRABLE
);
我想要做的是在事务进行时推迟外键检查,直到它提交。我只是看不出为什么会返回此错误以及如何使事务正常进行。
【问题讨论】:
-
它在 9.0 版本中就像一个魅力,完全没有问题。也应该在旧版本中工作。
-
就在昨天,我安装了 PostgreSQL,我使用的是最新版本 (9.0.3)。正如你所说,我知道它应该有效。这就是为什么我几乎要发疯试图找出导致此错误的任何错误...感谢您的关注。
-
逐个执行查询,包括 SET CONSTRAINTS,看看什么时候出错。使用尽可能简单的数据模型进行测试。
-
上次我遇到这个问题时,我的参考架构中有“可延迟”,但我忘记更改实际架构以匹配参考架构。 "\t table2" 告诉你什么?
-
是否有不使用
ON UPDATE CASCADE的令人信服的理由?
标签: postgresql transactions foreign-keys deferred