MySQL之TRUNCATE TABLE

共 725字,需浏览 2分钟

 ·

2022-04-29 20:14

TRUNCATE TABLE完全清空一个表。它需要DROP特权。

从逻辑上讲,TRUNCATE TABLE类似于删除所有行的DELETE语句,或类似于DROP TABLE和CREATE TABLE语句的序列。为了获得高性能,它绕过了删除数据的DML方法。因此,它不能回滚,也不会触发ON DELETE触发器,并且不能对具有父子外键关系的InnoDB表执行。


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

截断操作可删除并重新创建表,这比一一删除行要快得多,特别是对于大型表。

截断操作会导致隐式提交,因此无法回滚。(区别:SQL Server中,TRUNCATE TABLE是可以回滚数据的)

如果会话持有活动表锁,则无法执行截断操作。

如果存在其他引用该表的表的FOREIGN KEY约束,则InnoDB表或NDB表的TRUNCATE TABLE失败。允许在同一表的列之间使用外键约束。

截断操作不会为删除的行数返回有意义的值。通常的结果是“受影响的0行”,应解释为“无信息”。

只要表格式文件tbl_name.frm有效,就可以使用TRUNCATE TABLE将表重新创建为空表,即使数据或索引文件已损坏。

任何AUTO_INCREMENT值都将重置为其初始值。即使对于MyISAM和InnoDB,也是如此,它们通常不重用序列值。

与分区表一起使用时,TRUNCATE TABLE保留分区;也就是说,数据和索引文件将被删除并重新创建,而分区定义(.par)文件不受影响。

TRUNCATE TABLE语句不调用ON DELETE触发器。


浏览 27
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报