这是情况:我有两个表,其中一个引用另一个(例如,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 举报,一经查实,本站将立刻删除。