文档主页
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 TABLE 和 CREATE 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 值都将重置为其起始值。即使对于通常不重复使用序列值的 MyISAM 和 InnoDB 也是如此。

  • 与分区表一起使用时,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 位置。已知目录是由 datadir、innodb_data_home_dir 和 innodb_directories 变量定义的目录。要使 TRUNCATE TABLE 在其当前位置创建表空间,请在运行 TRUNCATE TABLE 之前将该目录添加到 innodb_directories 设置中。