清空数据表(TRUNCATE)

Exisi 2023-02-06 13:07:20
Categories: Tags:
  • 使用 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 不同:
    1. 截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。
    2. 截断操作会导致隐式提交,因此无法回滚。
    3. 如果会话持有活动表锁,则无法执行截断操作。
    4. 如果引用该表的其他表存在任何 FOREIGN KEY 约束,则对于 InnoDB 表或 NDB 表,TRUNCATE TABLE 将失败。允许在同一个表的列之间进行外键约束。
    5. 截断操作不会为已删除的行数返回有意义的值。通常的结果是“0 行受影响”,这应该被解释为“没有信息”。
    6. 只要表定义有效,即使数据或索引文件已损坏,也可以使用 TRUNCATE TABLE 将表重新创建为空表。
    7. 任何 AUTO_INCREMENT 值都会重置为其起始值。即使对于通常不重用序列值的 MyISAM InnoDB 也是如此。
    8. 当与分区表一起使用时,TRUNCATE TABLE 保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。
    9. TRUNCATE TABLE 语句不调用 ON DELETE 触发器。
    10. 支持截断损坏的 InnoDB 表。

 

 

来自 <https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html>