Delete 和 Truncate 命令的区别17 Mar 2025 | 5 分钟阅读 DELETE 和 TRUNCATE 命令的区别是面试题中最常见的部分。它们主要用于从数据库中删除数据。它们之间的主要区别在于,DELETE 语句在不重置表的标识的情况下删除数据,而 TRUNCATE 命令则重置特定表的标识。本文将完整概述 DELETE 和 TRUNCATE 命令以及它们之间的区别,这些命令主要可以互换使用,但实际上完全不同。  什么是 DELETE 命令?它是一个 DML(数据操纵语言)命令,用于从数据库中删除不需要的记录。它从表中删除完整的行并生成已删除行的计数。我们需要对目标表具有删除权限才能执行此命令。它还允许我们使用 WHERE 子句 从表中过滤和删除任何特定记录。 它明确指出,在执行此命令之前,我们必须备份数据库,因为我们无法使用此查询恢复已删除的记录。因此,数据库备份允许我们在将来需要时恢复数据。 以下语法解释了 DELETE 命令以从表中删除数据 什么是 TRUNCATE 命令?TRUNCATE 语句是一个 DDL(数据定义语言)命令,用于从表中删除所有数据,而不删除表结构。我们不能将 WHERE 子句与此命令一起使用,因此无法过滤记录。执行此命令后,我们无法回滚已删除的数据,因为在执行此操作时不会维护日志。 TRUNCATE 命令会释放页而不是行,并在事务日志中为释放的页而不是行创建条目。此命令会锁定页而不是行;因此,它需要更少的锁和资源。请注意,当表被外键引用或参与索引视图时,我们不能使用 TRUNCATE 语句。 以下语法解释了用于从表中删除数据的 TRUNCATE 命令。 DELETE 和 TRUNCATE 之间的主要区别以下几点解释了 DELETE 和 TRUNCATE 命令之间的区别 - DELETE 语句用于当我们想要从表中删除部分或全部记录时,而 TRUNCATE 语句将从表中删除所有行。
- DELETE 是一个 DML 命令,因为它只修改表数据,而 TRUNCATE 是一个 DDL 命令。
- DELETE 命令可以使用 WHERE 子句过滤记录/元组。但是,TRUNCATE 命令不允许使用 WHERE 子句,因此在截断时无法过滤行。
- DELETE 激活表上的所有删除触发器以触发。但是,TRUNCATE 操作不会触发任何触发器,因为它不操作单个行。
- DELETE 从表中逐行删除,一次删除一行,按其处理的顺序。然而,TRUNCATE 操作的是数据页而不是行,因为它一次删除整个表数据。
- DELETE 语句只删除记录,不重置表的标识,而 TRUNCATE 会重置特定表的标识。
- DELETE 命令需要更多的锁和数据库资源,因为它获取对每个已删除行的锁。相比之下,TRUNCATE 在删除数据页之前获取对数据页的锁;因此,它需要更少的锁和更少的资源。
- DELETE 语句在事务日志中为每个已删除的行创建一个条目,而 TRUNCATE 为每个数据页记录事务日志。
- TRUNCATE 命令比 DELETE 命令更快,因为它释放数据页而不是行,并在事务日志中记录数据页而不是行。
- 一旦使用 TRUNCATE 命令删除记录,我们就无法恢复它。相比之下,我们可以恢复通过 DELETE 操作删除的已删除数据。
DELETE vs. TRUNCATE 比较图表以下比较图快速解释了它们的主要区别 比较基础 | DELETE | TRUNCATE |
---|
定义 | DELETE 语句用于根据指定条件从现有表中删除单条或多条记录。 | TRUNCATE 命令删除现有表中的所有数据,但不删除表本身。它保留表结构或模式。 | 语言 | 它是一个 DML(数据操纵语言)命令。 | 它是一个 DDL(数据定义语言)命令。 | WHERE | 它可以使用 WHERE 子句从表中过滤任何特定行或数据。 | 它不使用 WHERE 子句从表中过滤记录。 | Permission | 我们需要具有 DELETE 权限才能使用此命令。 | 我们需要具有 ALTER 权限才能使用此命令。 | 工作方式 | 此命令逐个删除记录。 | 此命令删除包含记录的整个数据页。 | Lock | 它将在删除之前锁定行。 | 它将在删除之前锁定数据页。 | 表标识 | 此命令不重置表标识,因为它只删除数据。 | 它总是重置表标识。 | 交易 | 它为每个已删除的记录维护事务日志。 | 它不为每个已删除的数据页维护事务日志。 | 速度 | 它的速度较慢,因为它维护日志。 | 它的执行速度快,因为它一次删除所有数据,而不维护事务日志。 | 诱因 | 此命令还可以激活应用于表的触发器并使其触发。 | 此命令不激活应用于表的触发器以触发。 | 恢复 | 它允许我们使用 COMMIT 或 ROLLBACK 语句恢复已删除的数据。 | 执行此命令后,我们无法恢复已删除的数据。 | 索引视图 | 它可以与索引视图一起使用。 | 它不能与索引视图一起使用。 | Space (空格) | DELETE 语句比 TRUNCATE 占用更多的事务空间,因为它为每个已删除的行维护日志。 | TRUNCATE 语句占用更少的事务空间,因为它为整个数据页而不是每个行维护事务日志。 |
结论在本文中,我们比较了 DELETE 和 TRUNCATE 语句。我们得出结论,当我们想要自定义从表中删除记录时,使用 DELETE 命令。而当我们不想在表中留下任何记录或数据,即我们想要清空表时,使用 TRUNCATE 命令。
|