13.1.34 TRUNCATE TABLE语法

TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE用于清空数据表。需要DROP权限,逻辑上,与DELETE语句删除所有行类似,或等同于DROP TABLECREATE TABLE

为了获得更好的性能,TRUNCATE TABLE不同于DML删除数据的方法。因此,它不会出发ON DELETE触发器,不能用于有父子关系的外键表,并且不能回滚。但是,在服务器宕机时,支持原子DDL的存储引擎表的TRUNCATE TABLE操作要么完全提交,要么回滚。参考13.1.1 原子数据定义语句支持

尽管TRUNCATE TABLEDELETE类似,但它被归类为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 TABLEDROP TABLECREATE TABLE的重新映射,避免了有问题的LRU扫描。

TRUNCATE TABLE可以用于Performance Schema汇总表,但只是将值重置为0或null, 而不是删除行,参考Performance Schema Summary Tables

results matching ""

    No results matching ""