delete、drop、truncate 有什么区别?
DELETE、TRUNCATE、DROP 都能“删东西”,但删除的层级不同:
DELETE 删除数据行,TRUNCATE 清空整张表的数据,DROP 删除表本身。
1. DELETE:按条件删除数据
DELETE FROM orders
WHERE status = 'cancelled';
它可以使用 WHERE,只删除符合条件的行。
DELETE FROM orders;
不写 WHERE 时,会删除表中的所有数据,但表结构仍然存在。
删除后:
- 表还在;
- 字段还在;
- 索引、约束通常还在;
- 可以继续插入数据。
DELETE 属于逐行删除,通常会记录较详细的事务日志,因此大量删除时可能比较慢。
2. TRUNCATE:快速清空整张表
TRUNCATE TABLE orders;
它会删除表中的全部数据,但保留表结构。
删除后:
- 表还在;
- 字段还在;
- 索引和约束通常还在;
- 数据全部清空;
- 不能使用
WHERE。
下面这种写法是错误的:
TRUNCATE TABLE orders
WHERE status = 'cancelled';
因为 TRUNCATE 只能清空整张表,不能选择性删除。
在很多数据库中,TRUNCATE 比:
DELETE FROM orders;
更快,因为它通常不是逐行处理,而是直接回收或重置数据页。
另外,TRUNCATE 经常会重置自增序列。例如原来最大订单 ID 是 100:
TRUNCATE TABLE orders;
再次插入数据后,ID 可能从 1 重新开始。具体行为取决于数据库。
3. DROP:删除表本身
DROP TABLE orders;
执行后,不只是数据没了,连表结构也被删除了。
删除内容通常包括:
- 所有数据;
- 字段定义;
- 索引;
- 约束;
- 表本身。
执行完以后,再查询:
SELECT * FROM orders;
数据库会报错,因为 orders 表已经不存在。
要继续使用,必须重新建表:
CREATE TABLE orders (
id INT,
amount DECIMAL(10, 2)
);
三者对比
| 对比项 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 删除内容 | 部分或全部数据 | 全部数据 | 数据和表结构 |
| 表结构是否保留 | 保留 | 保留 | 不保留 |
能否使用 WHERE |
可以 | 不可以 | 不可以 |
| 删除速度 | 通常较慢 | 通常较快 | 通常很快 |
| 是否重置自增值 | 通常不重置 | 通常重置 | 表已不存在 |
| 是否触发删除触发器 | 通常会 | 视数据库而定 | 通常不会按行触发 |
| 能否回滚 | 取决于事务和数据库 | 取决于数据库 | 取决于数据库 |
“能否回滚”不能一概而论。例如 PostgreSQL 中不少 DDL 可以在事务里回滚,而某些数据库或特定存储引擎的行为不同。面试时最好说:
是否能回滚取决于具体数据库和事务配置,不能简单认为
TRUNCATE、DROP一定不能回滚。
用一个例子记忆
假设 orders 是一本订单登记簿:
DELETE:擦掉其中几条或全部订单记录,但登记簿还在。TRUNCATE:快速把整本登记簿的内容清空,但空白登记簿还在。DROP:连登记簿本身一起扔掉。
面试标准回答
DELETE是 DML 操作,可以通过WHERE删除部分数据,也可以删除全部数据,但保留表结构;TRUNCATE用于快速清空整张表,不能带WHERE,通常会重置自增值;DROP会直接删除表,包括数据、表结构、索引和约束。三者在事务回滚、日志和触发器方面的具体行为,需要结合数据库类型判断。
浙公网安备 33010602011771号