Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  TRUNCATE TABLE Statement

15.1.37 TRUNCATE TABLE 语句

TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE 完全清空一个表。它需要 DROP 权限。逻辑上,TRUNCATE TABLE 类似于删除所有行的 DELETE 语句,或者是一系列 DROP TABLECREATE TABLE 语句。

为了实现高性能,TRUNCATE TABLE 绕过了 DML 方法删除数据。因此,它不会触发 ON DELETE 触发器,不能用于具有父子外键关系的 InnoDB 表,且不能回滚像 DML 操作一样。然而,TRUNCATE TABLE 操作在使用原子 DDL 支持的存储引擎上的表时,要么完全提交,要么回滚,如果服务器在操作期间崩溃。更多信息,请参见 第 15.1.1 节,“原子数据定义语句支持”

尽管 TRUNCATE TABLEDELETE 相似,但它被分类为 DDL 语句,而不是 DML 语句。它与 DELETE 的区别在于:

  • 截断操作会删除和重新创建表,这比逐行删除行特别是在大表时要快得多。

  • 截断操作会导致隐式提交,因此不能回滚。请参见 第 15.3.3 节,“导致隐式提交的语句”

  • 如果会话持有活动表锁,则不能执行截断操作。

  • TRUNCATE TABLE 如果存在来自其他表的外键约束,则无法对 InnoDB 表或 NDB 表执行。同一表中的外键约束之间是允许的。

  • 截断操作不返回删除行数的有意义值。通常的结果是 0 行受影响,” 应该解释为 无信息。”

  • 只要表定义有效,表就可以使用 TRUNCATE TABLE 重新创建为空表,即使数据或索引文件已损坏。

  • 任何 AUTO_INCREMENT 值都会重置为其起始值。这对 MyISAMInnoDB 都是正确的,即使它们通常不重用序列值。

  • 当用于分区表时,TRUNCATE TABLE 保留分区;即数据和索引文件被删除并重新创建,而分区定义保持不变。

  • TRUNCATE TABLE 语句不调用 ON DELETE 触发器。

  • 截断损坏的 InnoDB 表是支持的。

TRUNCATE TABLE 在二进制日志记录和复制中被视为 DDL 语句,而不是 DML 语句,并且总是作为语句记录。

TRUNCATE TABLE 对于表关闭了使用 HANDLER OPEN 打开的所有处理程序。

TRUNCATE TABLE 可以与性能架构摘要表一起使用,但其效果是将摘要列重置为 0 或 NULL,而不是删除行。请参阅 第 29.12.20 节,“性能架构摘要表”

截断驻留在文件每个表表空间中的 InnoDB 表将删除现有的表空间并创建一个新的表空间。如果表空间是在不知道的目录下创建的,InnoDB 将在默认位置创建新的表空间,并在错误日志中写入以下警告:数据目录位置必须在已知目录中。数据目录位置将被忽略,并将文件放入默认的数据目录位置。已知目录是由 datadirinnodb_data_home_dirinnodb_directories 变量定义的。要使 TRUNCATE TABLE 在当前位置创建表空间,请在运行 TRUNCATE TABLE 之前将目录添加到 innodb_directories 设置中。