PostgreSQL:删除父表重复记录且保留子表数据的解决方案
主键重复+外键约束的解决步骤
先搞清楚子表那条
parent_id=1的记录,对应父表两条id=1记录里的哪一条。可以通过父表的其他字段(比如创建时间、业务专属字段)区分,标记出要保留的有效记录(记为A)和要删除的冗余记录(记为B)。
示例SQL(以MySQL为例,用create_time区分):SELECT id, create_time, other_columns FROM parent WHERE id = 1;给要删除的冗余父表记录改个临时ID,避开外键约束。直接删除会被子表的外键关联拦住,所以先把B的ID改成一个不冲突的临时值(比如1001):
-- 用唯一条件定位冗余记录B,比如它的create_time是较晚的那条 UPDATE parent SET id=1001 WHERE id=1 AND create_time = '冗余记录的创建时间';删除这个临时ID的冗余记录:
DELETE FROM parent WHERE id=1001;修复父表的主键约束——能出现主键重复,说明之前主键约束要么没添加,要么被意外禁用了,得补上防止再出问题:
-- 给父表添加主键约束(如果之前没有的话) ALTER TABLE parent ADD PRIMARY KEY (id);最后验证数据一致性:
-- 父表id=1的记录应该只剩1条 SELECT COUNT(*) FROM parent WHERE id=1; -- 子表的parent_id=1记录能正常关联父表 SELECT child.*, parent.* FROM child JOIN parent ON child.parent_id=parent.id WHERE child.parent_id=1;
内容的提问来源于stack exchange,提问作者twoLeftFeet
相关产品推荐
相关产品推荐

