MySQL多表删除stu_id匹配数据:单查询实现存在即删需求
解决两表stu_id匹配或单表存在时的批量删除问题
嘿,这个需求其实很好解决——核心就是先把所有需要删除的stu_id集合找出来,再分别清理两个表中属于这个集合的记录。之前的方法失败大概率是用了INNER JOIN,只有两表同时存在的id才会被处理,而我们要覆盖“单表存在”的场景,下面给你几种常用数据库的单条SQL实现方式:
方式1:支持CTE(公共表表达式)的数据库(MySQL 8.0+/PostgreSQL/SQL Server)
这种写法清晰直观,先通过UNION获取两个表中所有不重复的stu_id,再批量删除两表中对应记录:
WITH target_stu_ids AS ( -- 收集所有需要删除的stu_id(自动去重) SELECT stu_id FROM table1 UNION SELECT stu_id FROM table2 ) -- 先删table1,再删table2;部分数据库支持在单条语句中执行多个DELETE DELETE FROM table1 WHERE stu_id IN (SELECT stu_id FROM target_stu_ids); DELETE FROM table2 WHERE stu_id IN (SELECT stu_id FROM target_stu_ids);
如果你的数据库不允许在单条语句里执行多个DELETE,可以把这两个语句放在一个事务中执行,保证操作的原子性。
方式2:MySQL专属的多表DELETE写法
MySQL支持直接在DELETE语句中关联多个表,一步完成删除:
DELETE t1, t2 FROM ( SELECT stu_id FROM table1 UNION SELECT stu_id FROM table2 ) AS target_ids LEFT JOIN table1 t1 ON target_ids.stu_id = t1.stu_id LEFT JOIN table2 t2 ON target_ids.stu_id = t2.stu_id;
这里用LEFT JOIN关联目标id集合和两个表,不管id只在table1、只在table2,还是两表都有,对应的行都会被删除。
验证删除范围(重要!)
执行删除前,一定要先确认要删除的行是不是你想要的,可以用SELECT语句预览:
-- 查看table1要删除的记录 SELECT * FROM table1 WHERE stu_id IN (SELECT stu_id FROM table1 UNION SELECT stu_id FROM table2); -- 查看table2要删除的记录 SELECT * FROM table2 WHERE stu_id IN (SELECT stu_id FROM table1 UNION SELECT stu_id FROM table2);
内容的提问来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

