MySQL TRUNCATE 表

2025 年 8 月 19 日 | 阅读 7 分钟

MySQL 中的 TRUNCATE 语句可以在不删除其结构的情况下删除表中的所有数据。它属于DDL 或数据定义语言命令。通常,当我们想要删除表中的所有数据而不删除表结构时,我们会使用此命令。

TRUNCATE 命令的工作方式与不带 WHERE 子句的 DELETE 命令相同,后者会从表中删除完整行。然而,TRUNCATE 命令比 DELETE 命令更有效,因为它会删除并重新创建表,而不是一次删除一个记录。由于此命令在内部会删除并重新创建表,因此与返回已删除行数的 delete 语句不同,truncate 语句影响的行数为零。

此命令在执行期间不维护事务日志。它释放数据页而不是行,并在事务日志中为被释放的页而不是行进行条目。此命令还会锁定页而不是行;因此,它需要的锁和资源更少。

使用 TRUNCATE 命令时必须考虑以下几点:

  • 此命令不能使用 WHERE 子句,因此无法过滤记录。
  • 执行此命令后,我们无法回滚已删除的数据,因为在执行此操作时不会维护日志。
  • 当表被外键引用或参与索引视图时,不能使用 truncate 语句。
  • TRUNCATE 命令不会触发与被截断表相关的 DELETE 触发器,因为它不对单个行进行操作。

语法

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

在此语法中,首先,我们将指定要删除数据的表名。语法中的 TABLE 关键字是可选的。但最好使用它来区分 TRUNCATE() 函数和 TRUNCATE TABLE 语句

MySQL 截断表示例

让我们通过一个例子来演示如何截断表。首先,我们将使用以下语句创建一个名为“customer”的表。

接下来,我们将使用以下语句向此表中添加值。

现在,通过执行 SELECT 语句来验证表,以查看是否已插入记录。

我们将获得如下所示的输出:

mysql truncate table

现在,执行以下语句,使用上面讨论的 TRUNCATE 语法截断 customer 表。

成功执行后,我们将获得以下输出:

mysql truncate table

正如我们所见,此查询返回0 行受影响,即使所有表记录都被删除。我们可以通过再次执行 SELECT 语句来验证数据删除。此命令给出以下输出,表明表中不存在任何记录。

mysql truncate table

如何截断带有外键的表?

如果我们对使用外键约束的表执行 TRUNCATE 操作,我们将收到以下错误:

在这种情况下,我们需要登录到 MySQL 服务器并禁用外键检查,然后再执行 TRUNCATE 语句,如下所示:

现在,我们可以截断表了。执行后,重新启用外键检查,如下所示:

如何截断 MySQL 中的所有表?

MySQL 中的 TRUNCATE 语句一次只能删除一个表。如果要删除多个表,则需要执行单独的 TRUNCATE 语句。以下示例显示了如何在 MySQL 中截断多个表。

我们也可以使用以下 SQL 查询,该查询使用数据库中的表名一次生成多个 TRUNCATE TABLE 命令。

DELETE 与 TRUNCATE

尽管它们在概念上相似,但 TRUNCATE 和 DELETE 命令在以下几个方面存在显著差异:

DELETETRUNCATE
在 MySQL 中,DELETE 语句根据 WHERE 子句的要求从表中删除一个或多个条目。无论是否满足任何条件,TRUNCATE 命令都可以用于删除表中的每一行。
它是数据操作语言 (DML) 中的一个命令。它是数据定义语言 (DDL) 中的一个命令。
在对 DELETE 命令进行更改后,必须进行手动 COMMIT 才能使更改生效。使用 TRUNCATE 命令时,表的更改会立即提交。
它逐行删除,同时对每次删除应用特定标准。它一次删除所有信息。
在这种情况下,条件是 WHERE 子句。不需要使用 WHERE 子句。
删除后,每行都会被锁定。TRUNCATE 通过表锁来防止页被删除。
它记录日志文件中的每笔事务。仅记录包含数据的页的释放。
如果存在标识列,则表的标识不会恢复到其初始值。它将表的标识恢复到初始值。

DROP 与 TRUNCATE

DROP 和 TRUNCATE 命令是不同的。DROP 命令会从数据库中完全删除表,而 TRUNCATE 只删除表中的记录。

然而,下表总结了这些命令之间其余的差异。

拖放TRUNCATE
SQL 的 DROP 命令可以从数据库中删除整个表,包括其定义、索引、约束、数据等。TRUNCATE 命令重置表定义并删除表中的每一条记录,无论是否满足任何条件。
它是数据定义语言 (DDL) 中的一个命令。它也是数据定义语言 (DDL) 中的一个命令。
内存位于表空间中。内存中仍然包含该表。
所有完整性约束都已被删除。表仍有完整性限制。
要执行此命令,表模式和表分别需要 ALTER 和 CONTROL 权限。要截断表,只需要 ALTER 权限。
DROP 命令比 DELETE 快,但远不如 TRUNCATE 快。它比 DELETE 和 DROP 命令都快。

MySQL 中的 TRUNCATE 限制

  • 不可逆: TRUNCATE 会自动提交,即使在事务中也无法撤销。
  • 不激活触发器: BEFORE DELETE 和 AFTER DELETE 触发器未被激活,这使其区别于 DELETE 命令。
  • 外键限制: 除非首先禁用或删除 外键约束,否则具有活动外键约束的表无法被截断。
  • 重置 AUTO_INCREMENT: 重置 AUTO_INCREMENT 计数器并非总是推荐的做法。
  • 需要更多权限: TRUNCATE 用户必须拥有对表的 DROP 权限,而不是仅拥有 DELETE 权限。

总结

使用 TRUNCATE TABLE 命令可以快速删除 MySQL 表中的所有行。虽然 DELETE 会重置 AUTO_INCREMENT 计数器,但它不会激活触发器。此命令通常会立即提交且无法撤销,因为它属于 DDL。与 DELETE 相比,由于外键约束,TRUNCATE 对于大型数据集来说速度较慢。

总之,有效的数据库管理需要理解 DROP TABLE 和 TRUNCATE TABLE 之间的主要区别。TRUNCATE TABLE 只删除数据,保留表结构不变,而 DROP TABLE 删除整个表结构及其内容。您需要清除表内容还是完全删除表将决定哪种命令最适合您。为了确保您的数据库操作具有最佳性能并建立信心,我们建议您在 MySQL 环境中尝试和练习这两种命令。

常见问题

1. MySQL 的 TRUNCATE TABLE 命令做什么?

当使用 TRUNCATE TABLE 命令剥离表结构时,所有行都保持不变。如果您想在不删除表并重新开始的情况下删除所有数据,这将非常有用。此命令将表重置为其原始状态,这比逐行删除更快。

2. MySQL 中的 TRUNCATE 与 DELETE 有何区别?

两者都删除数据,但 DELETE 独立管理行并允许事务回滚。由于 TRUNCATE 一次性删除所有数据,并且通常是不可逆的,因此它更快。此外,TRUNCATE 重置自增值,而 DELETE 不会。

3. 您可以在 MySQL 中回滚 TRUNCATE 吗?

通常不能。由于 TRUNCATE 被解释为 DDL 命令并立即提交,因此无法回滚。虽然回滚不是一个可靠的功能,但在某些较新版本的 MySQL(使用 InnoDB)中,它可以在手动事务中工作。

4. TRUNCATE 是否比 DELETE 更快?

是的,TRUNCATE 通常快得多,因为它不是逐行删除。相反,它会快速释放表数据所占用的所有空间。如果您想删除所有行而无需跟踪或记录每次删除,这将非常理想。

5. 是否可以在外键表上使用 TRUNCATE?

如果表是外键关系的一部分,MySQL 将阻止截断。为了使用 TRUNCATE,必须删除或禁用约束,这通常很危险。在这种情况下,DELETE 是更好的选择。


下一个主题MySQL 描述表