求删除MySQL数据库中无对应有效用户记录的agreement_user与contract表数据的SQL查询语句
求删除MySQL数据库中无对应有效用户记录的agreement_user与contract表数据的SQL查询语句
嗨,这个问题我熟!咱们得按照表的依赖顺序来清理这些“孤儿数据”——先处理contract表(因为它依赖agreement_user),再清理agreement_user表,这样能避免触发不必要的外键冲突(哪怕之前没正确配置级联,这么做也更稳妥)。
第一步:清理关联已删除用户的contract记录
这条语句会先关联contract和agreement_user,再通过左连接匹配user表,精准定位到那些对应用户已被删除的合同记录并删除:
DELETE c FROM contract c JOIN agreement_user au ON c.agreement_user_id = au.agreement_user_id LEFT JOIN user u ON au.user_id = u.user_id WHERE u.user_id IS NULL;
简单说就是:找到所有绑定了“无有效用户的agreement_user”的contract,直接删掉它们。
第二步:清理无对应用户的agreement_user记录
接下来处理最直接的孤儿数据——那些没有绑定有效用户的agreement_user记录:
DELETE au FROM agreement_user au LEFT JOIN user u ON au.user_id = u.user_id WHERE u.user_id IS NULL;
通过左连接匹配用户表,但凡找不到对应user_id的agreement_user记录,直接清理掉。
额外提醒:给外键加级联删除,一劳永逸!
为了以后再也不用手动做这种清理工作,建议你给两张表的外键加上级联删除约束,这样以后删除user记录时,对应的agreement_user和contract会自动被删除:
给agreement_user的user_id外键添加级联:
ALTER TABLE agreement_user ADD CONSTRAINT fk_agreementuser_user FOREIGN KEY (user_id) REFERENCES user(user_id) ON DELETE CASCADE;
给contract的agreement_user_id外键添加级联:
ALTER TABLE contract ADD CONSTRAINT fk_contract_agreementuser FOREIGN KEY (agreement_user_id) REFERENCES agreement_user(agreement_user_id) ON DELETE CASCADE;
备注:内容来源于stack exchange,提问作者iphonem
相关产品推荐
相关产品推荐

