TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
完全清空一张桌子。它需要DROP
特权。从逻辑上讲,TRUNCATE
TABLE
类似于
DELETE
删除所有行的语句,或一系列DROP TABLE
andCREATE TABLE
语句。
为了实现高性能,TRUNCATE
TABLE
绕过了删除数据的DML方法。因此,它不会导致ON DELETE
触发器触发,不能对InnoDB
具有父子外键关系的表执行,也不能像 DML 操作一样回滚。但是,TRUNCATE
TABLE
如果服务器在操作期间停止,则对使用支持原子 DDL 的存储引擎的表的操作要么完全提交,要么回滚。有关详细信息,请参阅第 13.1.1 节,“原子数据定义语句支持”。
虽然TRUNCATE TABLE
类似于DELETE
,但它被归类为 DDL 语句而不是 DML 语句。它
DELETE
在以下方面有所不同:
截断操作删除并重新创建表,这比一行一行地删除行要快得多,特别是对于大表。
截断操作会导致隐式提交,因此无法回滚。请参阅第 13.3.3 节,“导致隐式提交的语句”。
如果会话持有活动表锁,则无法执行截断操作。
TRUNCATE TABLE
如果存在 来自引用该表的其他表的任何约束,则该InnoDB
表或 表将失败 。允许同一个表的列之间的外键约束。NDB
FOREIGN KEY
截断操作不会为已删除的行数返回有意义的值。通常的结果是“ 0 行受影响”,这应该被解释为“没有信息。”
只要表定义有效,就可以使用 将表重新创建为空表
TRUNCATE TABLE
,即使数据或索引文件已损坏。任何
AUTO_INCREMENT
值都将重置为其起始值。即使对于通常不重用序列值 的MyISAM
和也是如此。InnoDB
与分区表一起使用时,
TRUNCATE TABLE
保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。该
TRUNCATE TABLE
语句不调用ON DELETE
触发器。支持截断损坏的
InnoDB
表。
TRUNCATE TABLE
出于二进制日志记录和复制的目的被视为 DDL 而不是 DML,并且始终记录为语句。
TRUNCATE TABLE
for a table 关闭用打开的表的所有处理程序
HANDLER OPEN
。
在 MySQL 5.7 及更早版本中,在具有大型缓冲池并
innodb_adaptive_hash_index
启用的系统上TRUNCATE TABLE
,由于在删除表的自适应哈希索引条目时发生的 LRU 扫描,操作可能会导致系统性能暂时下降(错误#68184)。TRUNCATE
TABLE
toDROP TABLE
和
in MySQL 8.0的重新映射CREATE TABLE
避免了有问题的 LRU 扫描。
TRUNCATE TABLE
可以与 Performance Schema 汇总表一起使用,但效果是将汇总列重置为 0 或NULL
,而不是删除行。请参阅第 27.12.20 节,“性能模式摘要表”。
截断InnoDB
驻留在 file-per-table 表空间中的表会删除现有表空间并创建一个新表空间。从 MySQL 8.0.21 开始,如果表空间是使用较早版本创建的并且位于未知目录中,InnoDB
则在默认位置创建新表空间并将以下警告写入错误日志:DATA DIRECTORY location must be in a known目录。DATA DIRECTORY 位置将被忽略,文件将被放入默认的 datadir 位置。已知目录是由
datadir
、
innodb_data_home_dir
和
innodb_directories
变量定义的目录。要TRUNCATE TABLE
在其当前位置创建表空间,请将目录添加到
innodb_directories
运行前设置TRUNCATE TABLE
。