TRUNCATE TABLE
语法
TRUNCATE [TABLE] tbl_name [WAIT n | NOWAIT]
Contents
描述
TRUNCATE TABLE
用于彻底清空一张表。他需要DROP
权限,见GRANT
。
tbl_name
也可以按照格式db_name
.tbl_name
(见Identifier Qualifiers)来指定。
逻辑上,TRUNCATE TABLE
等价于DELETE
表中的所有行,但在某些环境下它们之间有些区别。
TRUNCATE TABLE
清空速度比DELETE
快,因为它是drop表然后重建空表,它绕过了DML操作,因此不会触发delete触发器,也因此无法回滚。对于XtraDB/InnoDB存储引擎来说,如果系统变量innodb_file_per_table设置为ON(从MariaDB 5.5开始的默认值),则速度会更快。
如果有FOREIGN KEY约束引用了某InnoDB table,那么对该表执行TRUNCATE TABLE
的时候将会报错:
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint
一张表中在字段之间允许存在多个外键约束。
对于InnoDB表,如果没有FOREIGN KEY
约束,在执行truncate的时候,会直接删除原始表,然后按照相同的表结构重建一张空表,因此速度比一行一行地delete行速度要快的多的多。在truncate重建表的时候,它会重置AUTO_INCREMENT的计数器。
TRUNCATE TABLE
影响的行数只有被映射为DELETE
语句的时候才是精确的,否则它所影响的行数都是0行。
对于其他存储引擎,TRUNCATE TABLE
与DELETE
有以下不同之处:
- Truncate操作等价于drop和re-create两个操作,因此速度比逐行delete快,特别是大表。
- Truncate操作隐含了commit操作。
- 如果有会话持有表锁,Truncation无法清空该表。
- Truncation操作不会实际被删除的行数量,而是返回"0 rows affected"。
- 如果表格式文件
tbl_name.frm
有效,则该表可以被truncate table
重建为空表(.frm中包含了表结构),且数据文件和索引文件也会随着做出整理。 - Truncate不会记住
AUTO_INCREMENT
上次使用的值,而是重新从初始值开始增长。MyISAM和InnoDB都如此。 - 当对分区表执行
TRUNCATE TABLE
时,会保留分区格式;因此,数据和索引文件会被删除后重建,但分区定义文件(.par)不会受到影响。 - 由于truncate表的时候不会使用
DELETE
操作表中的每一行,因此不会激活DELETE
触发器。 TRUNCATE TABLE
仅只重置Performance Schema summary tables的值为0或空,且不会移除任何行。
出于二进制日志和replication的考虑,TRUNCATE TABLE
被当作DROP TABLE + CREATE TABLE
两个动作,因此它是DDL而非DML。
无法对view执行TRUNCATE TABLE
。