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 則靈活的定位刪除 或 清空整張表

相關文章
相關標籤/搜索