15.1.37 截断表语句
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
将一个表完全清空。它需要DROP
权限。逻辑上,TRUNCATE TABLE
类似于一个DELETE
语句,该语句删除所有行,或者是一个DROP TABLE
和CREATE 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 TABLE
在NDB
表或NDB
表上失败,如果该表存在来自其他表的FOREIGN KEY约束。Foreign key constraints between columns of the same table are permitted. -
截断操作不返回删除行的数量。通常的结果是“0 rows affected,”,应该被解释为“没有信息.”
-
只要表定义是有效的,该表可以用
TRUNCATE TABLE
重新创建为空表,即使数据或索引文件已经损坏。 -
任何AUTO_INCREMENT值将被重置到其初始值。这对MyISAM和InnoDB来说都是如此,这些存储引擎通常不重用序列值。
-
在使用分区表时,
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位置。已知目录是由datadir
、innodb_data_home_dir
和innodb_directories
变量定义的。要让TRUNCATE TABLE
在当前位置创建表空间,请在运行TRUNCATE TABLE
之前将目录添加到innodb_directories
设置中。