TRUNCATE TABLE

语法

TRUNCATE [TABLE] tbl_name
  [WAIT n | NOWAIT]

描述

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 TABLEDELETE有以下不同之处:

  • 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

MariaDB starting with 10.3.0

WAIT/NOWAIT

会设置锁等待超时。见WAIT and NOWAIT

See Also

Comments

Comments loading...
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.