0

0

delete语句的基本语法规则_mysql删除语法理解

P粉602998670

P粉602998670

发布时间:2026-01-24 09:22:02

|

751人浏览过

|

来源于php中文网

原创

DELETE语句必须带WHERE子句,否则会清空整张表;它是DML操作,逐行删除并记binlog,但不重置自增主键;漏写WHERE将导致全表数据丢失且无法回滚。

delete语句的基本语法规则_mysql删除语法理解

DELETE 语句必须带 WHERE 子句,否则会清空整张表

MySQL 中 DELETE 是 DML 操作,不是 DDL,它逐行删除数据并记录 binlog(除非禁用),但不重置自增主键。最常见误操作就是漏写 WHERE —— 一旦执行 DELETE FROM users;全表数据立即消失,且无法通过 rollback 恢复(如果没开事务或已提交)。

实操建议:

  • 执行前先用 SELECT COUNT(*)SELECT * LIMIT 10 确认目标范围
  • 在生产环境强制使用事务包裹:
    BEGIN;
    DELETE FROM orders WHERE status = 'cancelled' AND created_at < '2023-01-01';
    -- 检查影响行数:SELECT ROW_COUNT();
    -- 确认无误再 COMMIT;否则 ROLLBACK
  • 开发/测试库可提前加 SQL_MODE='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' 并启用 safe-updates 模式(需客户端支持)

WHERE 条件中 NULL 判断必须用 IS NULL,不能用 = NULL

这是初学者高频踩坑点。= NULL 在 SQL 中永远返回 UNKNOWN,导致 DELETE FROM logs WHERE level = NULL; 实际不删任何行——即使表里真有 levelNULL 的记录。

正确写法只有两种:

  • WHERE level IS NULL
  • WHERE level NULL(MySQL 特有,空值安全等于,可同时匹配 NULL 和具体值,但一般不推荐用于 DELETE 场景)

其他常见错误条件写法:

  • WHERE id IN (1, 2, NULL) → 整个 IN 表达式结果为 UNKNOWN,等价于没条件
  • WHERE name != 'admin' → 会自动过滤掉所有 name IS NULL 的行,可能漏删

多表 DELETE 要显式声明别名,且语法结构和单表完全不同

MySQL 支持多表删除,但语法不是简单拼接。例如想删掉没有对应用户信息的订单,不能写 DELETE FROM orders, users WHERE orders.user_id = users.id —— 这是非法语法。

Mootion
Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

下载

正确写法分两类:

  • 从一个表删,关联多个表判断:
    DELETE o FROM orders AS o
    LEFT JOIN users AS u ON o.user_id = u.id
    WHERE u.id IS NULL;
  • 同时删多个表(慎用):
    DELETE o, l FROM orders AS o
    INNER JOIN logs AS l ON o.id = l.order_id
    WHERE o.status = 'failed';

注意:FROM 后面的表列表只用于关联,真正被删的是 DELETE 后明确列出的表(如 DELETE oDELETE o, l)。没列出来的表只是提供条件依据。

DELETE 和 TRUNCATE、DROP 的核心区别在于日志、锁和权限

很多人以为 TRUNCATE TABLE 只是“更快的 DELETE”,其实它们底层机制完全不同:

  • DELETE:逐行扫描+标记删除,生成 undo log 和 redo log,支持事务回滚,触发器生效,锁行为是行级锁(但可能升级)
  • TRUNCATE:直接释放数据页,重置 auto_increment,不走事务(DDL),不触发触发器,锁整个表,且需要 DROP 权限而非 DELETE 权限
  • DROP:删表结构+数据,不可逆

所以当你要清空大表时:

  • 要保留自增值、需事务控制、或有触发器逻辑 → 用 DELETE + 分批(如 WHERE id BETWEEN ? AND ?
  • 纯清空且能接受自增重置、无触发器依赖 → 用 TRUNCATE,快十倍以上
  • 千万别用 DELETE 去清空千万级表而不分批,容易锁表超时、binlog 膨胀、主从延迟爆炸

实际删大表前,务必确认存储引擎类型(InnoDB 对 DELETE 更友好,MyISAM 下 TRUNCATE 更快但更粗暴)和 binlog_format(ROW 模式下 DELETE 日志量远大于 STATEMENT)。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

685

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

324

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1117

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

359

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

717

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

577

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

419

2024.04.29

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 807人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号