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

前端之家收集整理的这篇文章主要介绍了设置约束延迟不适用于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”查询,问题解决了.

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

猜你在找的Postgre SQL相关文章