- 使用 TRUNCATE TABLE 可将表中所有记录清空,并将部分结构进行重置(如自增字段会恢复至初始值)
- TRUNCATE TABLE 完全清空表。它需要 DROP 权限。从逻辑上讲,TRUNCATE TABLE 类似于删除所有行的 DELETE 语句,或一系列 DROP TABLE 和 CREATE TABLE 语句。
- 为了实现高性能,TRUNCATE TABLE 绕过了删除数据的 DML 方法。因此,它不会导致 ON DELETE 触发器触发,它不能对具有父子外键关系的 InnoDB 表执行,也不能像 DML 操作那样回滚。但是,如果服务器在操作期间停止,则使用支持原子 DDL 的存储引擎的表上的 TRUNCATE TABLE 操作要么完全提交,要么回滚
语法
TRUNCATE [TABLE] tbl_name
示例
mysql> TRUNCATE temp;
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT * FROM
temp;
Empty set (0.00 sec)
注
- 尽管 TRUNCATE TABLE 类似于 DELETE,但它被归类为 DDL 语句而不是 DML 语句。它在以下方面与 DELETE 不同:
- 截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。
- 截断操作会导致隐式提交,因此无法回滚。
- 如果会话持有活动表锁,则无法执行截断操作。
- 如果引用该表的其他表存在任何 FOREIGN KEY 约束,则对于 InnoDB 表或 NDB 表,TRUNCATE TABLE 将失败。允许在同一个表的列之间进行外键约束。
- 截断操作不会为已删除的行数返回有意义的值。通常的结果是“0 行受影响”,这应该被解释为“没有信息”。
- 只要表定义有效,即使数据或索引文件已损坏,也可以使用 TRUNCATE TABLE 将表重新创建为空表。
- 任何 AUTO_INCREMENT 值都会重置为其起始值。即使对于通常不重用序列值的 MyISAM 和 InnoDB 也是如此。
- 当与分区表一起使用时,TRUNCATE TABLE 保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。
- TRUNCATE TABLE 语句不调用 ON DELETE 触发器。
- 支持截断损坏的 InnoDB 表。
来自 <https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html>