13.1.34 TRUNCATE TABLE语法
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
用于清空数据表。需要DROP
权限,逻辑上,与DELETE
语句删除所有行类似,或等同于DROP TABLE
和CREATE TABLE
为了获得更好的性能,TRUNCATE TABLE
不同于DML删除数据的方法。因此,它不会出发ON DELETE
触发器,不能用于有父子关系的外键表,并且不能回滚。但是,在服务器宕机时,支持原子DDL的存储引擎表的TRUNCATE TABLE
操作要么完全提交,要么回滚。参考13.1.1 原子数据定义语句支持。
尽管TRUNCATE TABLE
与DELETE
类似,但它被归类为DDL语句而不是DML语句。它与DELETE
的区别:
- truncate操作为drop和re-create表,比逐行删除数据要快很多,特别是大表的操作
- truncate操作为隐式提交,不能回滚,参考13.3.3 隐式提交语句
- 不能在有活动表锁的表上执行
- 如果innodb或NDB表有来自其它表的外键约束,则不能执行truncate操作,而相同表的不同列的外键约束则可以执行。
- truncate操作不会返回删除行数的值,通常返回“0 rows affected,”。
- 只要表定义有效,即使数据或索引文件已损坏,也可以使用TRUNCATE TABLE将表重新创建为空表。
- 任何AUTO_INCREMENT值都将重置为其起始值。即使对于通常不重用序列值的MyISAM和InnoDB也是如此。
- 与分区表一起使用时,TRUNCATE TABLE保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。
- TRUNCATE TABLE语句不会调用ON DELETE触发器
- 允许对损坏的truncate表进行操作
表的TRUNCATE TABLE操作会关闭使用HANDLER OPEN打开的所有handlers。
为了二进制日志的记录和复制,TRUNCATE TABLE
被视为DROP TABLE
语句后紧跟CREATE TABLE
, 即其为DDL语句而不是DML。这是因为在使用innodb和其它事物引擎时,隔离级别 (READ COMMITTED or READ UNCOMMITTED)下不允许使用statement格式日志,当使用STATEMENT or MIXED模式时,语句不会被记录和复制。(Bug #36763)然而,前面描述的方式可以在innodb的slave上应用。
在5.7及更早的版本,如果系统有较大的buffer pool,并且启用innodb_adaptive_hash_index
时,由于在删除表的自适应哈希索引条目时发生LRU扫描,TRUNCATE TABLE操作可能导致系统性能暂时下降(Bug #68184)。8.0中,TRUNCATE TABLE
与DROP TABLE
和CREATE TABLE
的重新映射,避免了有问题的LRU扫描。
TRUNCATE TABLE
可以用于Performance Schema汇总表,但只是将值重置为0或null, 而不是删除行,参考Performance Schema Summary Tables