SQL批量删除不同条件的记录_使用IN子句简化删除逻辑

DELETE必须配合WHERE使用,正确语法为DELETE FROM table_name WHERE column_name IN (...);直接DELETE FROM table_name IN (...)是语法错误。DELETE + IN 子句能批量删多条件记录,但必须加 WHERE 限定不加 WHERE 的 DELETE FROM table_name IN (...) 是语法错误------IN 不能直接跟在 DELETE 后面。正确写法永远是 DELETE FROM table_name WHERE column_name IN (...)。常见错误是把 IN 当成独立操作符,结果执行成全表删除或报错 ERROR 1064 (42000)。适用场景:要删一批已知主键或唯一标识的记录,比如后台运营导出需下架的 200 个商品 ID,或日志表中指定用户 ID 的操作记录。只对单列使用 IN 最稳妥;多列组合条件(如 (user_id, status))得用 JOIN 或子查询,别硬套 ININ 列表长度受 max_allowed_packet 和 MySQL 版本限制;MySQL 5.7 默认支持约 1000 项,超了会截断或报错 ERROR 1390 (HY000)如果 ID 来源是另一张表,优先写 DELETE t1 FROM table1 t1 JOIN table2 t2 ON t1.id = t2.target_id,比先查再拼 IN 更安全、更少网络传输IN 列表里 NULL 会导致整条 WHERE 失效WHERE id IN (1, 2, NULL, 4) 实际等价于 WHERE id = 1 OR id = 2 OR id = NULL OR id = 4,而 id = NULL 永远为 UNKNOWN,整个逻辑表达式可能不匹配任何行------不是删多了,而是删少了,且毫无提示。典型来源:从程序传参时没过滤空值,或前端提交了未填的下拉框、后端又用了 array_filter(ids, 'strlen') 这类只清空字符串不处理 null 的逻辑。PHP 中用 array_filter(ids, function(v) { return v !== null && $v !== ''; }) 显式剔除 nullPython 中用 [x for x in ids if x is not None and x != '']SQL 层补救:加 AND id IS NOT NULL,即 WHERE id IN (...) AND id IS NOT NULL大批量删用 IN 容易锁表或超时删 10 万行时,WHERE id IN (...) 仍是一条语句,MySQL 会尝试一次性加锁、生成执行计划、写 binlog。在高并发写入的表上,可能触发 Lock wait timeout exceeded 或拖慢其他查询。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

相关推荐
m0_684501982 小时前
Golang如何解析嵌套JSON_Golang嵌套JSON解析教程【简明】
jvm·数据库·python
2301_814809862 小时前
防止SQL注入的运维实践_实时清理数据库缓存与历史记录.txt
jvm·数据库·python
liu****2 小时前
LangGraph-AI应用开发框架(三)
人工智能·python·langchain·langgraph·大模型部署
来自远方的老作者2 小时前
第10章 面向对象-10.2类和对象
python·面向对象·类和对象·hasattr函数·setattr函数·getattr函数
qq_452396232 小时前
【工程实战】第八篇:报告美学 —— Allure 深度定制:让 Bug 定位精准到秒
开发语言·python·bug
qq_372906932 小时前
宝塔面板网站无法发邮件怎么办_检查PHP函数与SMTP配置
jvm·数据库·python
2401_883600253 小时前
怎么为MongoDB事务调优:将读操作尽量移到事务外面执行.txt
jvm·数据库·python
l1t3 小时前
DeepSeek总结的致力于在一分钟内将十亿行数据插入 SQLite
python·sqlite
m0_493934533 小时前
Go 中嵌入类型字段在派生结构体字面量中的初始化规则详解
jvm·数据库·python