MySQL DELETE和TRUNCATE区别

DELETE 和 TRUNCATE 命令之间的区别是面试问题中最常见的部分。它们主要用于从数据库中删除数据。它们之间的主要区别在于 delete 语句删除数据而不重置表的身份,而 truncate 命令重置特定表的身份。本文解释了 DELETE 和 TRUNCATE 命令的完整概述及其主要可互换使用但完全不同的区别。

一、什么是 DELETE 命令?

DELETE 命令是一种DML 或数据操作命令,用于从表中删除数据库中不需要的记录。它从表中删除完整的行并产生已删除行的计数。我们需要目标表的删除权限才能执行此命令。它还允许我们使用表中的WHERE子句过滤和删除任何特定记录。

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

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

DELETE FROM table_name WHERE condition; 

二、什么是 TRUNCATE 命令?

truncate 语句是一个DDL 或数据定义语言命令,用于在不删除表结构的情况下从表中删除完整数据。我们不能在该命令中使用WHERE子句,因此无法过滤记录。执行此命令后,我们无法回滚已删除的数据,因为执行此操作时未维护日志。

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

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

TRUNCATE TABLE table_name;  

三、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 与 TRUNCATE 比较表

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

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

结论

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

 

热门文章

优秀文章