mysql truncate 和delete区别?
TRUNCATE TABLE 语句
语法:
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
完全清空一张桌子。它需要DROP 特权。从逻辑上讲,TRUNCATE TABLE
类似于 DELETE删除所有行的语句,或一系列DROP TABLE 和CREATE TABLE语句。
为实现高性能,TRUNCATE TABLE
绕过了删除数据的 DML 方法。因此,它不会导致ON DELETE触发器触发,不能对InnoDB具有父子外键关系的表执行,也不能像 DML 操作那样回滚。但是,TRUNCATE TABLE
如果服务器在操作期间停止,则对使用原子 DDL 支持的存储引擎的表的操作要么完全提交,要么回滚。
delete
是从表中删除行的 DML 语句。
虽然TRUNCATE TABLE
类似于DELETE
,但它被归类为 DDL 语句而不是 DML 语句。它与 DELETE以下几个方面不同:
-
截断操作删除并重新创建表,这比逐行删除要快得多,尤其是对于大型表。
-
截断操作会导致隐式提交,因此无法回滚。
-
如果会话持有活动表锁,则无法执行截断操作。
-
TRUNCATE TABLE如果引用该表的其他表存在任何约束,则 该InnoDB表或 表失败 。允许在同一个表的列之间进行外键约束。 NDBFOREIGN KEY
-
截断操作不会为已删除的行数返回有意义的值。通常的结果是“受影响的行数为 0 ”,应解释为“无信息”。”
-
只要表定义有效, TRUNCATE TABLE即使数据或索引文件已损坏,也可以将表重新创建为空表。
-
任何AUTO_INCREMENT值都将重置为其起始值。即使对于MyISAM 和也是如此InnoDB,通常不重用序列值。
-
与分区表一起使用时, TRUNCATE TABLE保留分区;也就是说,数据和索引文件被删除并重新创建,而分区定义不受影响。
-
该TRUNCATE TABLE语句不调用ON DELETE触发器。
-
支持截断损坏的InnoDB表。
TRUNCATE TABLE
出于二进制日志记录和复制的目的,将其视为 DDL 而不是 DML,并且始终记录为语句。