PostgreSQL ON DELETE CASCADE级联删除行数不符合预期问题
PostgreSQL级联删除未生效问题排查
我不确定带有REFERENCE ... ON DELETE CASCADE约束的PostgreSQL表执行删除操作是否正常运行。
我创建了如下表:
CREATE TABLE formula ( id bigint PRIMARY KEY, mass numeric(13,8) NOT NULL CHECK (mass > 0), parent bigint NOT NULL REFERENCES id ON DELETE CASCADE );
导入数据后,我需要删除所有mass >= 1000.0且id = parent的行,首先执行如下查询统计符合条件的最小删除行数:
SELECT COUNT(*) FROM formula WHERE mass >= 1000.0 AND id = parent; count ---------- 25800000
查询得到符合条件的行数为25800000行。由于设置了REFERENCE ... ON DELETE CASCADE约束,我预期实际删除行数会高于25800000,因为存在不满足id=parent条件但关联了待删除行的记录会被级联删除。
我执行了如下删除语句:
DELETE FROM formula WHERE mass >= 1000.0 AND id = parent; DELETE 25800000
执行后返回的删除行数同样为25800000,和直接匹配条件的行数一致,我想知道是DELETE语句仅统计直接删除的行数、不包含级联删除的行数,还是级联删除功能未生效?
问题解决方案
后续使用\d+ formula命令重新检查表的约束,原表的约束如下:
[...] Indexes: "pkey" PRIMARY KEY, btree (id) Foreign-key constraints: "parent_fkey" FOREIGN KEY (parent) REFERENCES formula(id) ON DELETE CASCADE Referenced by: TABLE "formula" CONSTRAINT "parent_fkey" FOREIGN KEY (parent) REFERENCES formula(id) ON DELETE CASCADE
而实际使用的新表约束如下:
[...] Indexes: "formula_pkey" PRIMARY KEY, btree (id)
可见新表丢失了外键约束声明,因此级联删除自然无法正常运行,问题得到解决。
内容的提问来源于stack exchange,提问作者jw44lavo
相关产品推荐
相关产品推荐

