如何删除reminder和reminder_users表冗余数据并保留单条有效记录
操作前置要求
执行删除前务必先备份全量数据,避免误删无法恢复:
-- 备份子表 CREATE TABLE reminder_users_bak AS SELECT * FROM reminder_users; -- 备份父表 CREATE TABLE reminder_bak AS SELECT * FROM reminder;
第一步:删除子表reminder_users冗余行
逻辑为按r.name, r.remark, u.user_id, u.deadline分组,每组保留1条记录(以下示例保留每组rowid最大的行,如需保留最早插入的行可将MAX改为MIN):
DELETE FROM reminder_users u WHERE u.rowid NOT IN ( SELECT MAX(u2.rowid) AS keep_rowid FROM reminder r INNER JOIN reminder_users u2 ON r.id = u2.reminder_id GROUP BY r.name, r.remark, u2.user_id, u2.deadline );
执行删除前建议先将DELETE替换为SELECT *查询要删除的行,确认符合预期后再执行删除操作
第二步:删除父表reminder冗余行
子表删除完成后,父表中无对应子表关联的行即为冗余行,直接删除即可:
DELETE FROM reminder r WHERE NOT EXISTS ( SELECT 1 FROM reminder_users u WHERE u.reminder_id = r.id );
兼容说明
如果你使用的是MySQL这类不支持rowid的数据库,可以将上述语句中的rowid替换为子表的主键字段(比如子表主键为id则替换为u.id),逻辑完全一致。
内容的提问来源于stack exchange,提问作者schmimla
相关产品推荐
相关产品推荐

