Mysql TRUNCATE 和 DELETE 清空表操做的区别

本质:sql

TRUNCATE 是 DDL(数据定义语言), DELETE 是 DML(数据操做语言)spa

因此 truncate 操做是没法在事务中回滚的,但 delete 在事务上下文中在 commit 前是能够回滚code

常见的 DDL 命令还有 CREATE/ALTER/DROP,这些操做在事务上下文中都是没法回滚的,你可认为它们自带提交事务


一、TRUNCATE TABLE `tabName` | 在任何引擎中均可以快速清空表rem

# 清空表 没法回滚 重置表高度和水平线(即 auto_increment = 1)
TRUNCATE TABLE `tabName`;

    

在InnoDB引擎中清空表 TRUNCATE 要比 DELETE 高效,由于 DELETE 命令在 InnoDB 引擎中是一行行的删除(在 MyISAM中二者应该不分上下,都是直接将表清空后从新建立一个新表),而 TRUNCATE 则是直接将表删掉从新建立一个新的,同时重置表水平线,自增等特性都将复位it


二、 DELETE FROM `tabName` [ WHERE conditions ......] | 能够定位删除 能够清空表 事务上下文可回退 不重置表高度及水平线io

# 清空表 事务上下文可回滚 不重置表高度和水平线
DELETE FROM `tabName`;


MyISAM引擎中为清空重建表 InnoDB中为一行一行的删除class

因此效率方面 DELETE <= TRUNCATE,但灵活性方面 DELETE > TRUNCATE效率


总结:总结

一、TRUNCATE 命令用来快速清空重置表 DELETE 虽能够清空表但不会重置表水平线(例如你在 DELETE 清空某个表以前它的 ID 自增列最大值为 99,当你清空后再次插入数据则 ID 从 100 开始自增,而 TRUNCATE 则会复位到你的表初次建立时的设定)


二、TRUNCATE 在事务上下文中没法回滚,DELETE 则能够在你提交前回滚操做


三、TRUNCATE 专职于快速清空表,DELETE 则灵活的定位删除 或 清空整张表

相关文章
相关标签/搜索