DELETE WHERE语句需带WHERE条件防全表删除,验证用SELECT;NULL用IS NULL判断,字符串注意空格和大小写;多表删除须显式指定别名;大表应分批删除避免锁表。
MySQL 中删除满足条件的数据,核心就是 DELETE FROM table_name WHERE condition。但必须强调:没有 WHERE 子句的 DELETE 会清空整张表,且不可回滚(除非有事务且未提交)。执行前务必确认条件能精准匹配目标行,建议先用 SELECT * FROM table_name WHERE condition 验证。
MySQL 的 WHERE 对 NULL 值不能用 = 判断,必须用 IS NULL 或 IS NOT NULL;字符串字段若含前后空格,WHERE name = 'abc' 可能不命中实际值为 'abc ' 的记录(取决于 sql_mode 和字段类型);默认情况下,VARCHAR 比较不区分大小写(受 collation 影响),如需严格区分,改用 WHERE name COLLATE utf8mb4_0900_as_cs = 'AbC'。
MySQL 支持多表删除,但语法和单表不同。想根据关联表条件删主表数据,不能直接写 DELETE FROM t1 JOIN t2 ON ... WHERE ...。正确写法是:
DELETE t1 FROM users AS t1 JOIN orders AS t2 ON t1.id = t2.user_id WHERE t2.status = 'cancelled';
注意点:
t1)在 DELETE 后FROM 后可跟多个表,但只有前面列出的表会被删除You can't specify target table for update in FROM clause)对百万级以上表执行 DELETE WHERE,可能长时间持有行锁

DELETE FROM logs WHERE created_at < '2023-01-01' LIMIT 10000;
循环执行直到影响行为 0。同时注意:
WHERE 字段有索引,否则全表扫描 + 锁定开销极大CREATE TABLE ... SELECT 提取有效数据,再重命名切换,比删更快更安全真正危险的不是语法写错,而是没验证 WHERE 条件是否真的只命中预期的几行——线上误删往往发生在“我以为这个条件很唯一”的瞬间。