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表或 表将失败 。允许同一个表的列之间的外键约束。NDBFOREIGN KEY截断操作不会为已删除的行数返回有意义的值。通常的结果是“ 0 行受影响”,这应该被解释为“没有信息。”
只要表定义有效,就可以使用 将表重新创建为空表
TRUNCATE TABLE,即使数据或索引文件已损坏。任何
AUTO_INCREMENT值都将重置为其起始值。即使对于通常不重用序列值 的MyISAM和也是如此。InnoDB与分区表一起使用时,
TRUNCATE TABLE保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。该
TRUNCATE TABLE语句不调用ON DELETE触发器。支持截断损坏的
InnoDB表。
TRUNCATE TABLE出于二进制日志记录和复制的目的被视为 DDL 而不是 DML,并且始终记录为语句。
TRUNCATE TABLEfor a table 关闭用打开的表的所有处理程序
HANDLER OPEN。
在 MySQL 5.7 及更早版本中,在具有大型缓冲池并
innodb_adaptive_hash_index
启用的系统上TRUNCATE TABLE,由于在删除表的自适应哈希索引条目时发生的 LRU 扫描,操作可能会导致系统性能暂时下降(错误#68184)。TRUNCATE
TABLEtoDROP 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。