【发布时间】:2021-11-25 23:59:10
【问题描述】:
(作为背景,我使用的是 Postgres 12.4)
我不清楚为什么在两个表之间存在循环 FK 并且两个 FK 都设置为 ON DELETE CASCADE 时删除工作。
CREATE TABLE a (id bigint PRIMARY KEY);
CREATE TABLE b (id bigint PRIMARY KEY, aid bigint references a(id) on delete cascade);
ALTER TABLE a ADD COLUMN bid int REFERENCES b(id) ON DELETE CASCADE ;
insert into a(id) values (5);
insert into b(id, aid) values (10,5);
update a set bid = 10 where id=5;
DELETE from a where id=5;
我正在考虑的方式是,当您删除表“a”中 PK id = 5 的行时,postgres 会查看具有引用约束的表,该引用约束引用 a(id),它找到 b,它尝试删除表 b 中 id = 10 的行,但是它必须查看引用 b(id) 的表,所以它会返回到 a,然后它应该只是以无限循环结束。
但情况似乎并非如此。删除完成,没有错误。 正如一些消息来源在网上所说的那样,您也不能创建循环约束。约束已成功创建,且均不可延迟。
所以我的问题是 - 为什么 postgres 会完成这个循环级联,即使两个约束都没有设置为可延迟,如果它能够这样做,那么即使有 DEFERRABLE 选项又有什么意义呢?
【问题讨论】:
标签: database postgresql cascade postgresql-12