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