delete、drop、truncate 有什么区别?

DELETETRUNCATEDROP 都能“删东西”,但删除的层级不同:

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 可以在事务里回滚,而某些数据库或特定存储引擎的行为不同。面试时最好说:

是否能回滚取决于具体数据库和事务配置,不能简单认为 TRUNCATEDROP 一定不能回滚。


用一个例子记忆

假设 orders 是一本订单登记簿:

  • DELETE:擦掉其中几条或全部订单记录,但登记簿还在。
  • TRUNCATE:快速把整本登记簿的内容清空,但空白登记簿还在。
  • DROP:连登记簿本身一起扔掉。

面试标准回答

DELETE 是 DML 操作,可以通过 WHERE 删除部分数据,也可以删除全部数据,但保留表结构;TRUNCATE 用于快速清空整张表,不能带 WHERE,通常会重置自增值;DROP 会直接删除表,包括数据、表结构、索引和约束。三者在事务回滚、日志和触发器方面的具体行为,需要结合数据库类型判断。

posted @ 2026-07-27 16:07  余风0903  阅读(2)  评论(0)    收藏  举报