• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • TRUNCATE TABLE语句

    TRUNCATE [TABLE] tbl_name
    

    TRUNCATE TABLE完全清空一张桌子。它需要DROP特权。从逻辑上讲,TRUNCATE TABLE它类似于DELETE删除所有行的语句或DROP TABLE and CREATE TABLE语句的序列。

    为了获得高性能,请TRUNCATE TABLE绕过删除数据的DML方法。因此,它不会ON DELETE触发触发器,无法对InnoDB具有父子外键关系的表执行触发器,也无法像DML操作那样回滚。但是,TRUNCATE TABLE如果服务器在其操作期间停止运行,则对使用原子DDL支持的存储引擎的表上的操作将完全落实或回退。有关更多信息,请参见“原子数据定义语句支持”。

    尽管TRUNCATE TABLE与相似DELETE,但它被分类为DDL语句而不是DML语句。它与DELETE以下方面不同:

    • 截断操作可删除并重新创建表,这比一一删除行要快得多,特别是对于大型表。
    • 截断操作会导致隐式提交,因此无法回滚。请参见“START TRANSACTION,COMMIT和ROLLBACK语句”。
    • 如果会话持有活动表锁,则无法执行截断操作。
    • TRUNCATE TABLE如果来自其他表的任何约束都引用该表,则该InnoDB表或NDB表失败FOREIGN KEY。允许在同一表的列之间使用外键约束。
    • 截断操作不会为删除的行数返回有意义的值。通常的结果是“受影响的0行”,应将其解释为“无信息”。”
    • 只要表定义有效,就可以使用将该表重新创建为空表TRUNCATE TABLE,即使数据或索引文件已损坏。
    • 任何AUTO_INCREMENT值都将重置为其初始值。即使对于MyISAMInnoDB,也是如此,它们通常不重用序列值。
    • 与分区表一起使用时,TRUNCATE TABLE保留分区;也就是说,数据和索引文件将被删除并重新创建,而分区定义不受影响。
    • TRUNCATE TABLE语句不调用ON DELETE触发器。
    • InnoDB支持截断损坏的表。

    TRUNCATE TABLE对于一个表,将关闭用打开的表的所有处理程序HANDLER OPEN

    TRUNCATE TABLE出于二进制日志记录和复制的目的,将DROP TABLE其后处理,CREATE TABLE即DDL而不是DML。这是由于以下事实,当使用InnoDB事务隔离级别不允许基于语句的日志记录(READ COMMITTEDREAD UNCOMMITTED)和其他事务存储引擎时,在使用STATEMENTMIXED日志记录模式时未记录和复制该语句。(缺陷号36763)但是,它仍以InnoDB以前描述的方式应用于复制从属。

    在MySQL 5.7和更早版本中,在具有大缓冲池并已innodb_adaptive_hash_index启用的TRUNCATE TABLE系统上,由于在删除表的自适应哈希索引条目时发生LRU扫描,因此操作可能会导致系统性能暂时下降(错误#68184)。在MySQL 8.0 中TRUNCATE TABLEDROP TABLE和的重新映射CREATE TABLE避免了有问题的LRU扫描。

    TRUNCATE TABLE可以与Performance Schema摘要表一起使用,但是效果是将摘要列重置为0或NULL,而不是删除行。请参见“性能架构摘要表”。