MySQL 5.7删除数据行时设置多例外的问题求助
解决MySQL 5.7删除数据时设置多条例外的问题
嘿,针对你在task_take_over表中删除数据时需要排除特定行的需求,我给你整理了几种实用的方法。先假设你的场景是:删除user_ID=16且task_ID=100的大部分记录,但要保留指定的(year, week)组合(比如2018年第10周和第12周的那两行),如果你的实际需求有微调,也可以基于这些方法轻松修改。
方法1:用NOT IN直接指定例外组合
如果要保留的记录不多,这种写法最简洁直接,MySQL 5.7支持多列的NOT IN语法:
DELETE FROM task_take_over WHERE user_ID = 16 AND task_ID = 100 -- 把要保留的(year, week)组合用元组列在这里 AND (year, week) NOT IN ((2018, 10), (2018, 12));
要是你的表主键是ID,直接用ID指定例外会更高效,比如:
DELETE FROM task_take_over WHERE user_ID = 16 AND task_ID = 100 AND ID NOT IN (1, 3);
方法2:用LEFT JOIN筛选要删除的行
如果要保留的记录较多,或者例外条件需要从其他表获取,左连接的方式会更灵活:
-- 给要删除的表起别名t,保留的记录子查询起别名keep DELETE t FROM task_take_over t LEFT JOIN ( -- 这里写筛选保留记录的条件 SELECT ID FROM task_take_over WHERE (year=2018 AND week=10) OR (year=2018 AND week=12) ) keep ON t.ID = keep.ID -- 只删除那些不在保留列表里的行 WHERE t.user_ID = 16 AND t.task_ID = 100 AND keep.ID IS NULL;
方法3:用NOT EXISTS子查询(处理NULL更安全)
如果你的例外字段可能存在NULL值,NOT EXISTS比NOT IN更可靠,不会因为NULL导致意外的结果:
DELETE FROM task_take_over t WHERE t.user_ID = 16 AND t.task_ID = 100 AND NOT EXISTS ( SELECT 1 FROM task_take_over keep_rows WHERE keep_rows.ID = t.ID AND ((keep_rows.year=2018 AND keep_rows.week=10) OR (keep_rows.year=2018 AND keep_rows.week=12)) );
重要提醒!
执行删除操作前,一定要先把DELETE换成SELECT *验证一下要删除的行是不是你预期的,比如:
SELECT * FROM task_take_over WHERE user_ID = 16 AND task_ID = 100 AND (year, week) NOT IN ((2018, 10), (2018, 12));
要是表数据量很大,记得给user_ID、task_ID这些查询字段加索引,能大幅提升删除操作的速度。
内容的提问来源于stack exchange,提问作者Roy Zon
相关产品推荐
相关产品推荐

