文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0MB
PDF (A4) - 40.1MB
手册页 (TGZ) - 258.2KB
手册页 (Zip) - 365.3KB
信息文件 (Gzip) - 4.0MB
信息文件 (Zip) - 4.0MB


MySQL 9.0 参考手册  /  ...  /  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 节“导致隐式提交的语句”

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

  • 如果其他表中存在引用该表的任何 FOREIGN KEY 约束,则 TRUNCATE TABLEInnoDB 表或 NDB 表执行失败。允许同一表中各列之间的外键约束。

  • 截断操作不会为已删除行的数量返回有意义的值。通常的结果是 受影响的行数为 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 设置中。