You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:20:34