Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

15.1.37 截断表语句

TRUNCATE [TABLE] tbl_name

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

为了提高性能,TRUNCATE TABLE绕过了DML方法删除数据。因此,它不会触发ON DELETE触发器,它不能在NDB表中使用父子外键关系,也不能像DML操作那样回滚。然而,TRUNCATE TABLE操作在使用原子DDL支持存储引擎的表上运行时,或者是完全提交的,或者是回滚的。如果服务器在操作期间崩溃,For more information, see Section 15.1.1, “Atomic Data Definition Statement Support”

虽然TRUNCATE TABLE类似于DELETE,它被分类为DDL语句,而不是DML语句。它与DELETE不同之处在于:

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

  • 截断操作将隐式提交,因此不能回滚。见Section 15.3.3, “Statements That Cause an Implicit Commit”

  • 截断操作不能在会话中持有活动表锁定的会话中进行。

  • TRUNCATE TABLENDB表或NDB表上失败,如果该表存在来自其他表的FOREIGN KEY约束。Foreign key constraints between columns of the same table are permitted.

  • 截断操作不返回删除行的数量。通常的结果是0 rows affected,,应该被解释为没有信息.

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

  • 任何AUTO_INCREMENT值将被重置到其初始值。这对MyISAMInnoDB来说都是如此,这些存储引擎通常不重用序列值。

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

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

  • 支持对损坏的InnoDB表进行截断操作。

TRUNCATE TABLE将被视为DDL操作,而不是DML操作,并且总是作为语句被记录。

TRUNCATE TABLE对表的所有处理器都将关闭,这些处理器使用HANDLER OPEN打开的。

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

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