创建FK外键关系时如何删除表B中无匹配关联的无效数据行?
最简实现方案
步骤1:删除表B中无匹配的无效行
优先用NOT EXISTS写法,兼容性最高且执行效率较好:
DELETE b FROM 表B b WHERE NOT EXISTS ( SELECT 1 FROM 表A a WHERE a.PK主键 = b.关联表A的外键字段 );
执行删除前可先运行查询语句确认要删除的行数,避免误删:
SELECT COUNT(*) FROM 表B b WHERE NOT EXISTS (SELECT 1 FROM 表A a WHERE a.PK主键 = b.关联表A的外键字段);
步骤2:正式创建外键约束
ALTER TABLE 表B ADD CONSTRAINT 自定义外键约束名 FOREIGN KEY (关联表A的外键字段) REFERENCES 表A(PK主键);
如果需要后续删除表A主键记录时,自动清空表B对应的关联行,可以在语句末尾加ON DELETE CASCADE参数。
注意事项
- 操作前建议先备份表B全量数据,防止误删无法恢复
- 表B中用于关联的字段数据类型、字符集、排序规则必须和表A的主键字段完全一致,否则外键创建会报错
- 大表执行删除/加约束操作前建议先暂停相关业务写请求,避免锁表影响业务
内容的提问来源于stack exchange,提问作者user3258911
相关产品推荐
相关产品推荐

