24、delete 删除表数据
1、delete 子句
从表中删除数据,执行一个“删除所有行”的 DML 操作。
过程:
- 逐行扫描并删除
- 每一行删除都写入事务日志(用于回滚和恢复)
- 触发
DELETE触发器(如果有)
语法:
delete from 表名 where 条件 -- 删除特定的行 delete from 表名 -- 删除所有的行
注:delete 只删除表中数据,不删除表。
-- 功能:从表中删除记录 -- 节点解析: -- DELETE FROM - 指定要删除数据的表 -- WHERE - 删除条件(重要!避免误删全部数据) DELETE FROM employees WHERE termination_date IS NOT NULL -- 只删除已离职员工 AND termination_date < '2022-01-01'; -- 且离职时间早于2022年 -- 分批次删除大数据量(避免锁表) DELETE FROM large_table WHERE condition = true LIMIT 1000; -- 每次只删除1000条
2、truncate 子句
通过释放存储表数据的数据页来清空表,属于 DDL 操作。
过程:
- 不逐行删除,而是取消分配数据页
- 仅记录页释放的日志(日志量极小)
- 不触发触发器
- 重置自增列(IDENTITY / AUTO_INCREMENT)为初始值
语法:
truncate table 表名; -- 删除原来的表,并重新建立一张同名的表
| 特性 | DELETE FROM table_name; | TRUNCATE TABLE table_name; |
|---|---|---|
| SQL 类型 | DML(数据操作语言) | DDL(数据定义语言) |
| 是否可带 WHERE | ✅ 可以(删除部分数据) | ❌ 不可以(只能清空整表) |
| 逐行删除 | ✅ 是(记录每行日志) | ❌ 否(直接释放数据页) |
| 事务回滚 | ✅ 支持(在事务中可回滚) | ⚠️ 多数数据库不支持回滚 |
| 触发器触发 | ✅ 会触发 DELETE 触发器 |
❌ 不会触发触发器 |
| 性能 | 慢(尤其大表) | 极快(几乎瞬间完成) |
| 锁机制 | 行锁或页锁 | 表锁(排他锁) |
| 重置自增计数器 | ❌ 不重置(MySQL 除外) | ✅ 重置为初始值 |
| 外键约束影响 | ✅ 受外键约束限制 | ⚠️ 某些数据库禁止 truncate 被引用的表 |
| 所需权限 | DELETE 权限 |
DDL 权限(如 ALTER) |
*注意:在 SQL Server 中,TRUNCATE 可以回滚,在 Oracle 中部分支持
本文来自博客园,作者:chao_xiong,转载请注明原文链接:https://www.cnblogs.com/chao-xiong/p/19245077

浙公网安备 33010602011771号