MySQL DELETE和TRUNCATE命令的区别

MySQL DELETE和TRUNCATE命令的区别

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

MySQL 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命令之间的区别:

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

DELETE vs. TRUNCATE比较表格

以下比较表格以简洁的方式解释它们的主要区别:

比较基础 DELETE (删除) TRUNCATE (截断)
定义 删除语句用于根据指定的条件从现有表中删除单个或多个记录。 截断命令从现有表中删除完整的数据,但不删除表本身。它保留表的结构或模式。
语言 它是DML(数据操作语言)命令。 它是DDL(数据定义语言)命令。
WHERE 可以使用WHERE子句从表中筛选任何特定行或数据。 不使用WHERE子句从表中筛选记录。
权限 我们需要具有DELETE权限才能使用此命令。 我们需要具有ALTER权限才能使用此命令。
工作方式 此命令逐个删除记录。 此命令删除包含记录的整个数据页。
锁定 在删除之前会锁定该行。 在删除之前会锁定数据页。
表身份 此命令不会重置表身份,因为它只删除数据。 它总是重置表身份。
事务 它为每个删除的记录维护事务日志。 它不为每个删除的数据页维护事务日志。
速度 由于维护日志,它的速度较慢。 由于一次性删除整个数据,它的执行速度很快,而不需要维护事务日志。
触发器 此命令还可以激活应用于表上的触发器并导致它们触发。 此命令不会激活应用于表上的触发器触发。
还原 使用提交或回滚语句可以恢复已删除的数据。 使用此命令后无法还原已删除的数据。
索引视图 可以与索引视图一起使用。 不能与索引视图一起使用。
空间 删除语句占用的事务空间比截断要多,因为它为每个删除的行维护日志。 截断语句占用的事务空间较少,因为它为整个数据页而不是每一行维护事务日志。

结论

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程