TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
完全清空一个表。它需要 DROP
权限。逻辑上,TRUNCATE TABLE
类似于删除所有行的 DELETE
语句,或者是一系列 DROP TABLE
和 CREATE TABLE
语句。
为了实现高性能,TRUNCATE TABLE
绕过了 DML 方法删除数据。因此,它不会触发 ON DELETE
触发器,不能用于具有父子外键关系的 InnoDB
表,且不能回滚像 DML 操作一样。然而,TRUNCATE TABLE
操作在使用原子 DDL 支持的存储引擎上的表时,要么完全提交,要么回滚,如果服务器在操作期间崩溃。更多信息,请参见 第 15.1.1 节,“原子数据定义语句支持”。
尽管 TRUNCATE TABLE
与 DELETE
相似,但它被分类为 DDL 语句,而不是 DML 语句。它与 DELETE
的区别在于:
-
截断操作会删除和重新创建表,这比逐行删除行特别是在大表时要快得多。
-
截断操作会导致隐式提交,因此不能回滚。请参见 第 15.3.3 节,“导致隐式提交的语句”。
-
如果会话持有活动表锁,则不能执行截断操作。
-
TRUNCATE TABLE
如果存在来自其他表的外键约束,则无法对InnoDB
表或NDB
表执行。同一表中的外键约束之间是允许的。 -
截断操作不返回删除行数的有意义值。通常的结果是 “0 行受影响,” 应该解释为 “无信息。”
-
只要表定义有效,表就可以使用
TRUNCATE TABLE
重新创建为空表,即使数据或索引文件已损坏。 -
任何
AUTO_INCREMENT
值都会重置为其起始值。这对MyISAM
和InnoDB
都是正确的,即使它们通常不重用序列值。 -
当用于分区表时,
TRUNCATE TABLE
保留分区;即数据和索引文件被删除并重新创建,而分区定义保持不变。 -
TRUNCATE TABLE
语句不调用ON DELETE
触发器。 -
截断损坏的
InnoDB
表是支持的。
TRUNCATE TABLE
在二进制日志记录和复制中被视为 DDL 语句,而不是 DML 语句,并且总是作为语句记录。
TRUNCATE TABLE
对于表关闭了使用 HANDLER OPEN
打开的所有处理程序。
TRUNCATE TABLE
可以与性能架构摘要表一起使用,但其效果是将摘要列重置为 0 或 NULL
,而不是删除行。请参阅 第 29.12.20 节,“性能架构摘要表”。
截断驻留在文件每个表表空间中的 InnoDB
表将删除现有的表空间并创建一个新的表空间。如果表空间是在不知道的目录下创建的,InnoDB
将在默认位置创建新的表空间,并在错误日志中写入以下警告:数据目录位置必须在已知目录中。数据目录位置将被忽略,并将文件放入默认的数据目录位置。已知目录是由 datadir
、innodb_data_home_dir
和 innodb_directories
变量定义的。要使 TRUNCATE TABLE
在当前位置创建表空间,请在运行 TRUNCATE TABLE
之前将目录添加到 innodb_directories
设置中。