设置约束可延迟对PostgreSQL事务不起作用

fra*_*ala 13 postgresql transactions foreign-keys deferred

情况就是这样:我有两个表,其中一个引用另一个表(例如,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;
Run Code Online (Sandbox Code Playgroud)

错误:

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".
Run Code Online (Sandbox Code Playgroud)

和桌子结构:

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
);
Run Code Online (Sandbox Code Playgroud)

我想要做的是在事务进行时推迟外键检查,直到它提交为止.我只是看不出为什么这个错误会返回,我怎么能让事务工作.

fra*_*ala 7

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

很抱歉让你进入这个.解决方案很简单,但那天我却没有看到它.

  • 感谢您的更新 - 很高兴知道您已经解决了!为什么不给自己打勾? (2认同)