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 命令之间的区别:
- 当我们想从表中删除部分或全部记录时使用 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 与 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 命令,即我们想清空表。
热门文章
优秀文章