MySQL之TRUNCATE TABLE
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触发器。
评论