在 MySQL 中,使用 truncate、delete 和 drop 都可以實現表刪除,但它們 3 個的使用場景和執行效果完全不同,接下來我們來盤點一下。

truncate、delete、drop區別概述

它們 3 個的區別如下表所示:

image.png

接下來我們用案例來演示一下它們的區別。

準備工作

正式開始之前,我們先來創建一個用戶表和用戶測試數據,方便後續演示使用:

image.png

創建的表結構和數據如下圖所示:

image.png

1.刪除對象不同

delete 和 truncate 隻刪除表數據,不刪除表結構,其中 delete 刪除之後的結果如下:

image.png

我們先將表還原到初始狀態,再使用 truncate 執行刪除操作,執行結果如下圖所示:

image.png

把表還原到初始狀態,執行 drop 刪除語句,執行結果如下圖所示:

image.png

從上述結果可以看出,delete 和 truncate 隻刪除表數據,而 drop 把表結構和表數據都刪除瞭。

2.刪除條件支持不同

truncate 和 drop 不支持添加 where 條件,而 delete 支持 where 條件,如下圖所示:

image.png

3.命令分類不同

truncate、delete 和 drop 所屬 SQL 分類不同,SQL 分為以下 3 類:

  1. DDL【Data Definition Language】數據定義語言,用來維護存儲數據的結構代表指令: create、drop、alter、truncate。
  2. DML【Data Manipulation Language】數據操縱語言,用來對數據進行操作代表指令:insert,delete,update,DML 中又單獨分瞭一個 DQL,數據查詢語言,代表指令是 select。
  3. DCL【Data Control Language】數據控制語言,主要負責權限管理和事務代表指令:grant,revoke,commit。

其中 delete 屬於 DML,而 truncate 和 drop 屬於 DDL。

4.回滾支持不同

delete 屬於 DML 支持事務回滾操作,而 truncate 和 drop 屬於 DDL,執行之後立馬生效,且數據是不可恢復的,接下來我們來驗證一下。 首先先將 MySQL 的自動事務提交關閉,自動事務提交的默認值是“ON”也就是開啟瞭自動提交,如下圖所示:

image.png

我們使用以下命令將自動提交(事務)關掉:

image.png

再次查詢事務自動提交的設置結果如下:

image.png

接下來我們演示一下 delete 的回滾操作,如下圖所示:

image.png

從上述結果可以看出 delete 之後是可以進行恢復(回滾)的,而 truncate 和 drop 之後是不能回滾的,各位老鐵可以使用相同的方法自行測試一下後兩種 SQL 的執行。

5.自增初始化不同

delete 不會重置自增字段的初始值,如下圖所示:

image.png

而 truncate 會重置自增字段的初始值,如下圖所示:

image.png

6.執行速度不同

delete 是逐行執行的,並且在執行時會把操作日志記錄下來,以備日後回滾使用,所以 delete 的執行速度是比較慢的;而 truncate 的操作是先復制一個新的表結構,再把原先的表整體刪除,所以它的執行速度居中,而 drop 的執行速度最快。

總結

truncate、drop 和 delete 的區別主要有以下 6 點:

  1. 執行速度:drop > truncate > detele。
  2. delete 和 truncate 隻刪除表數據,而 drop 會刪除表數據和表結構以及表的索引、約束和觸發器。
  3. delete 可以加 where 條件實現部分數據刪除,而 truncate 和 drop 不能加 where 條件是整體刪除。
  4. truncate 和 drop 是立即執行,且不能恢復;而 delete 會走事務,可以撤回和恢復。
  5. truncate 會重置自增列為 1,而 delete 不會重置自增列。
  6. truncate 和 drop 是 DDL 語句,而 delete 是 DML 語句。

好瞭,本期內容到這裡就結束瞭。

各位老鐵一鍵三連哦,我們有緣下期再見