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
设置中。