微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置约束延迟不适用于PostgreSQL事务

这是情况:我有两个表,其中一个引用另一个(例如,table2引用表1).创建这些表时,我将外键约束设置为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
);

我想做的是在交易进行时推迟外键检查,直到它提交.我只是看不到为什么这个错误返回,我如何使事务工作.

这个问题确实是一个外键约束违规.我的意思是说,这个限制确实在事务中推迟了,但问题是在事务结束时,在table1和table2被更新之后,新的数据违反了外键约束.我正在更新table1行的主键,它仍然被某些table2行引用.这些行我也必须更新它们,所以table2行的引用列与table1的行的更新的主键匹配.我更改了事务中的“UPDATE”查询,问题解决了.

对不起,让你进入这个.解决方案非常简单,但那天我无法看清.

原文地址:https://www.jb51.cc/postgresql/192608.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐