文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  TRUNCATE TABLE 语句

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 操作那样回滚。但是,如果服务器在其操作期间停止,则对使用原子 DDL 支持的存储引擎的表执行的 TRUNCATE TABLE 操作将完全提交或回滚。有关更多信息,请参阅 第 15.1.1 节,“原子数据定义语句支持”

虽然 TRUNCATE TABLE 类似于 DELETE,但它被归类为 DDL 语句而不是 DML 语句。它与 DELETE 的不同之处在于以下方面

  • 截断操作会删除并重新创建表,这比逐行删除要快得多,特别是对于大型表。

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

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

  • 如果 InnoDB 表或 NDB 表存在来自其他表的引用该表的任何 FOREIGN KEY 约束,则 TRUNCATE TABLE 将失败。允许同一表列之间的外键约束。

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

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

  • 任何 AUTO_INCREMENT 值都将重置为其起始值。即使对于通常不重复使用序列值的 MyISAMInnoDB 也是如此。

  • 与分区表一起使用时,TRUNCATE TABLE 会保留分区;也就是说,数据和索引文件会被删除并重新创建,而分区定义不受影响。

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

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

出于二进制日志记录和复制的目的,TRUNCATE TABLE 被视为 DDL 而不是 DML,并且始终作为语句记录。

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

TRUNCATE TABLE 可以与 Performance Schema 汇总表一起使用,但其作用是将汇总列重置为 0 或 NULL,而不是删除行。请参阅 第 29.12.20 节“Performance Schema 汇总表”

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