暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的SQL语句 - 数据定义语句(19)- TRUNCATE TABLE 语句

数据库杂货铺 2021-04-12
288
TRUNCATE TABLE 语句
 
    TRUNCATE [TABLE] tbl_name
    复制
     
    TRUNCATE TABLE 语句完全清空表。它需要 DROP 权限。从逻辑上讲,TRUNCATE TABLE 类似于删除所有行的 DELETE 语句,或者是 DROP TABLE CREATE TABLE 语句的组合。
     
    为了实现高性能,TRUNCATE TABLE 绕过了删除数据的 DML 方法。因此,它不会触发 ON DELETE 触发器,不能对具有父-子外键关系的 InnoDB 表执行此命令,也不能像 DML 操作那样回滚。但是,如果服务器在操作期间停止,使用支持原子 DDL 的存储引擎的表上的 TRUNCATE TABLE 操作将被完全提交或回滚。
     
    虽然 TRUNCATE TABLE 与 DELETE 类似,但它被归为 DDL 语句,而不是 DML 语句。与 DELETE 有以下几个不同之处:
     
    ● 截断操作删除并重新创建表,这比逐行删除要快得多,特别是对于大型表。
     
    ● 截断操作会导致隐式提交,因此无法回滚。
     
    ● 如果会话有生效的表锁定,则无法执行截断操作。
     
    ● 对于 InnoDB NDB 表,如果有其他表引用该表的 FOREIGN KEY 约束,TRUNCATE TABLE 命令就会失败。允许在同一表的列之间进行外键约束。
     
    ● 截断操作不会返回删除的行数。通常的结果是0行受影响”,这应该解释为“没有信息”。
     
    ● 只要表定义有效,即使数据或索引文件已损坏,也可以使用 TRUNCATE TABLE 语句将表重新创建为空表。
     
    ● 任何 AUTO_INCREMENT 值将被重置为它的初始值。即使对于通常不重用序列值的 MyISAM InnoDB 也是如此。
     
    ● 当与分区表一起使用时,TRUNCATE TABLE 语句保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。
     
    ● TRUNCATE TABLE 语句不会引发 ON DELETE 触发器。
     
    ● 支持截断损坏的 InnoDB 表。
     
    对一个表执行 TRUNCATE TABLE 语句,将关闭通过 HANDLER OPEN 对该表打开的所有句柄。
     
    从二进制日志记录和复制的角度看,TRUNCATE TABLE 类似于 DROP TABLE 后面紧跟 CREATE TABLE 语句,即 DDL 而不是 DML。这是因为,当使用 InnoDB 和其他事务存储引擎时,如果事务隔离级别不允许基于语句的日志记录( READ COMMITTED READ UNCOMMITTED ),则在使用 STATEMENT MIXED 日志模式时,不会记录和复制语句。但是,它仍然以前面描述的方式应用于使用 InnoDB 的副本。
     
    在 MySQL5.7 及更早版本中,在一个具有巨大缓冲池和启用 innodb_adaptive_hash_index 的系统上,由于删除表的自适应哈希索引项时发生LRU扫描,TRUNCATE TABLE 操作可能会导致系统性能暂时下降。MySQL 8.0TRUNCATE TABLE DROP TABLE CREATE TABLE 的重新映射避免了 LRU 扫描的问题。
     
    TRUNCATE TABLE 可用于性能架构摘要表,但其效果是将摘要列重置为 0 NULL,而不是删除行。
     
    截断独立表空间中的 InnoDB 表,将删除现有表空间并创建一个新表空间。从 MySQL 8.0.21 开始,如果表空间是用早期版本创建的,并且位于一个未知的目录中,InnoDB 会在默认的位置创建新的表空间,并在错误日志中写入如下警告:The DATA DIRECTORY location must be in a known directory. The DATA DIRECTORY location will be ignored and the file will be put into the default datadir location. 已知的目录是由 datadirinnodb_data_home_dir innodb_directory 变量定义的目录。要让 TRUNCATE TABLE 在当前位置创建表空间,请在运行 TRUNCATE TABLE 之前将目录添加到 innodb_directory 设置中。
     
     
     
     
     
    官方文档:
    https://dev.mysql.com/doc/refman/8.0/en/truncate-table.html
     

    文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论