PostgreSQL约束异常:删除提示不存在,添加提示已存在
PostgreSQL约束存在性矛盾问题的解决
遇到这种删不掉又加不上的矛盾情况,大概率是约束记录在系统表中存在,但和表的实际约束状态不一致,或者约束名被其他对象占用了,按下面步骤排查解决:
先查清楚约束的真实状态
执行这条SQL,查看serveurs_domain约束的所属表、类型等关键信息:SELECT conname, conrelid::regclass, contype, conkey FROM pg_constraint WHERE conname = 'serveurs_domain';- 如果结果里
conrelid不是serveurs,说明该约束属于其他表,直接去对应表执行DROP CONSTRAINT操作即可。 - 如果
conrelid就是serveurs,但ALTER TABLE DROP CONSTRAINT报错,尝试删除对应的索引——PostgreSQL创建唯一约束时会自动生成同名唯一索引,有时索引残留会导致这种矛盾状态:
删除索引后再重新添加约束就能恢复正常。DROP INDEX IF EXISTS serveurs_domain;
- 如果结果里
排查大小写问题
PostgreSQL默认会将未加双引号的标识符转为小写,若你的约束是用双引号创建的(比如"Serveurs_Domain"),用小写名称操作会找不到,但添加时又会因实际存在而报错。可以用模糊查询确认:SELECT conname FROM pg_constraint WHERE conname ILIKE 'serveurs_domain';如果查到带大写的约束名,删除时需要加双引号:
ALTER TABLE serveurs DROP CONSTRAINT "Serveurs_Domain";
内容的提问来源于stack exchange,提问作者Karam
相关产品推荐
相关产品推荐

