MySQL DELETE和TRUNCATE命令的区别
删除和截断命令的区别是面试问题中最常见的部分。它们主要用于从数据库中删除数据。 它们之间的主要区别在于,删除语句在不重置表的标识的情况下删除数据,而截断命令则重置特定表的标识 。本文将完整介绍DELETE和TRUNCATE命令及其之间的区别,虽然它们在使用上可以互换,但实际上完全不同。
什么是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激活表上的所有删除触发器。但是,截断操作不会激活任何触发器,因为它不以单行为单位操作。
- DELETE按照处理顺序逐个删除表中的行。但是,TRUNCATE操作的是数据页而不是行,因为它一次删除整个表的数据。
- DELETE语句仅删除记录,不重置表的标识。而TRUNCATE会重置特定表的标识。
- DELETE命令需要更多的锁和数据库资源,因为它对每个已删除行获取锁。相比之下,TRUNCATE在删除数据页之前会获取数据页上的锁,因此需要较少的锁和资源。
- DELETE语句为每个删除的行在事务日志中记录一条记录,而TRUNCATE为每个数据页记录事务日志。
- TRUNCATE命令比DELETE命令更快,因为它释放数据页而不是行,并且在事务日志中记录数据页而不是行。
- 使用TRUNCATE命令删除记录后,无法恢复。相反,可以恢复从DELETE操作中删除的数据。
DELETE vs. TRUNCATE比较表格
以下比较表格以简洁的方式解释它们的主要区别:
比较基础 | DELETE (删除) | TRUNCATE (截断) |
---|---|---|
定义 | 删除语句用于根据指定的条件从现有表中删除单个或多个记录。 | 截断命令从现有表中删除完整的数据,但不删除表本身。它保留表的结构或模式。 |
语言 | 它是DML(数据操作语言)命令。 | 它是DDL(数据定义语言)命令。 |
WHERE | 可以使用WHERE子句从表中筛选任何特定行或数据。 | 不使用WHERE子句从表中筛选记录。 |
权限 | 我们需要具有DELETE权限才能使用此命令。 | 我们需要具有ALTER权限才能使用此命令。 |
工作方式 | 此命令逐个删除记录。 | 此命令删除包含记录的整个数据页。 |
锁定 | 在删除之前会锁定该行。 | 在删除之前会锁定数据页。 |
表身份 | 此命令不会重置表身份,因为它只删除数据。 | 它总是重置表身份。 |
事务 | 它为每个删除的记录维护事务日志。 | 它不为每个删除的数据页维护事务日志。 |
速度 | 由于维护日志,它的速度较慢。 | 由于一次性删除整个数据,它的执行速度很快,而不需要维护事务日志。 |
触发器 | 此命令还可以激活应用于表上的触发器并导致它们触发。 | 此命令不会激活应用于表上的触发器触发。 |
还原 | 使用提交或回滚语句可以恢复已删除的数据。 | 使用此命令后无法还原已删除的数据。 |
索引视图 | 可以与索引视图一起使用。 | 不能与索引视图一起使用。 |
空间 | 删除语句占用的事务空间比截断要多,因为它为每个删除的行维护日志。 | 截断语句占用的事务空间较少,因为它为整个数据页而不是每一行维护事务日志。 |
结论
在本文中,我们对删除和截断语句进行了比较。我们得出的结论是,当我们想要自定义从表中删除记录时,使用DELETE命令。而当我们不想在表中留下任何记录或数据时,即我们想要清空表时,使用TRUNCATE命令。