Delete 和 Truncate 命令的区别

17 Mar 2025 | 5 分钟阅读

DELETE 和 TRUNCATE 命令的区别是面试题中最常见的部分。它们主要用于从数据库中删除数据。它们之间的主要区别在于,DELETE 语句在不重置表的标识的情况下删除数据,而 TRUNCATE 命令则重置特定表的标识。本文将完整概述 DELETE 和 TRUNCATE 命令以及它们之间的区别,这些命令主要可以互换使用,但实际上完全不同。

Delete vs Truncate Command

什么是 DELETE 命令?

它是一个 DML(数据操纵语言)命令,用于从数据库中删除不需要的记录。它从表中删除完整的行并生成已删除行的计数。我们需要对目标表具有删除权限才能执行此命令。它还允许我们使用 WHERE 子句 从表中过滤和删除任何特定记录。

它明确指出,在执行此命令之前,我们必须备份数据库,因为我们无法使用此查询恢复已删除的记录。因此,数据库备份允许我们在将来需要时恢复数据。

以下语法解释了 DELETE 命令以从表中删除数据

什么是 TRUNCATE 命令?

TRUNCATE 语句是一个 DDL(数据定义语言)命令,用于从表中删除所有数据,而不删除表结构。我们不能将 WHERE 子句与此命令一起使用,因此无法过滤记录。执行此命令后,我们无法回滚已删除的数据,因为在执行此操作时不会维护日志。

TRUNCATE 命令会释放页而不是行,并在事务日志中为释放的页而不是行创建条目。此命令会锁定页而不是行;因此,它需要更少的锁和资源。请注意,当表被外键引用或参与索引视图时,我们不能使用 TRUNCATE 语句。

以下语法解释了用于从表中删除数据的 TRUNCATE 命令。

DELETE 和 TRUNCATE 之间的主要区别

以下几点解释了 DELETE 和 TRUNCATE 命令之间的区别

  1. DELETE 语句用于当我们想要从表中删除部分或全部记录时,而 TRUNCATE 语句将从表中删除所有行。
  2. DELETE 是一个 DML 命令,因为它只修改表数据,而 TRUNCATE 是一个 DDL 命令。
  3. DELETE 命令可以使用 WHERE 子句过滤记录/元组。但是,TRUNCATE 命令不允许使用 WHERE 子句,因此在截断时无法过滤行。
  4. DELETE 激活表上的所有删除触发器以触发。但是,TRUNCATE 操作不会触发任何触发器,因为它不操作单个行。
  5. DELETE 从表中逐行删除,一次删除一行,按其处理的顺序。然而,TRUNCATE 操作的是数据页而不是行,因为它一次删除整个表数据。
  6. DELETE 语句只删除记录,不重置表的标识,而 TRUNCATE 会重置特定表的标识。
  7. DELETE 命令需要更多的锁和数据库资源,因为它获取对每个已删除行的锁。相比之下,TRUNCATE 在删除数据页之前获取对数据页的锁;因此,它需要更少的锁和更少的资源。
  8. DELETE 语句在事务日志中为每个已删除的行创建一个条目,而 TRUNCATE 为每个数据页记录事务日志。
  9. TRUNCATE 命令比 DELETE 命令更快,因为它释放数据页而不是行,并在事务日志中记录数据页而不是行。
  10. 一旦使用 TRUNCATE 命令删除记录,我们就无法恢复它。相比之下,我们可以恢复通过 DELETE 操作删除的已删除数据。

DELETE vs. TRUNCATE 比较图表

以下比较图快速解释了它们的主要区别

比较基础DELETETRUNCATE
定义DELETE 语句用于根据指定条件从现有表中删除单条或多条记录。TRUNCATE 命令删除现有表中的所有数据,但不删除表本身。它保留表结构或模式。
语言它是一个 DML(数据操纵语言)命令。它是一个 DDL(数据定义语言)命令。
WHERE它可以使用 WHERE 子句从表中过滤任何特定行或数据。它不使用 WHERE 子句从表中过滤记录。
Permission我们需要具有 DELETE 权限才能使用此命令。我们需要具有 ALTER 权限才能使用此命令。
工作方式此命令逐个删除记录。此命令删除包含记录的整个数据页。
Lock它将在删除之前锁定行。它将在删除之前锁定数据页。
表标识此命令不重置表标识,因为它只删除数据。它总是重置表标识。
交易它为每个已删除的记录维护事务日志。它不为每个已删除的数据页维护事务日志。
速度它的速度较慢,因为它维护日志。它的执行速度快,因为它一次删除所有数据,而不维护事务日志。
诱因此命令还可以激活应用于表的触发器并使其触发。此命令不激活应用于表的触发器以触发。
恢复它允许我们使用 COMMIT 或 ROLLBACK 语句恢复已删除的数据。执行此命令后,我们无法恢复已删除的数据。
索引视图它可以与索引视图一起使用。它不能与索引视图一起使用。
Space (空格)DELETE 语句比 TRUNCATE 占用更多的事务空间,因为它为每个已删除的行维护日志。TRUNCATE 语句占用更少的事务空间,因为它为整个数据页而不是每个行维护事务日志。

结论

在本文中,我们比较了 DELETE 和 TRUNCATE 语句。我们得出结论,当我们想要自定义从表中删除记录时,使用 DELETE 命令。而当我们不想在表中留下任何记录或数据,即我们想要清空表时,使用 TRUNCATE 命令。