在 MySQL 中,刪除的方法總共有 3 種:delete、truncate、drop,而三者的用法和使用場景又完全不同,接下來我們具體來看。
detele 可用於刪除表的部分或所有資料,它的使用語法如下:
delete from table_name [where...] [order by...] [limit...]
PS:[] 中的命令為可選命令,可以被省略。
如果我們要刪除學生表中數學成績排名最高的前 3 位學生,可以使用以下 SQL:
delete from student order by math desc limit 3;
在 InnoDB 引擎中,delete 操作並不是真的把資料刪除掉了,而是給資料打上刪除標記,標記為刪除狀態,這一點我們可以通過將 MySQL 設定為非自動提交模式,來測試驗證一下。
非自動提交模式的設定 SQL 如下:
set autocommit=0;
之後先將一個資料 delete 刪除掉,然後再使用 rollback 回滾操作,最後驗證一下我們之前刪除的資料是否還存在,如果資料還存在就說明 delete 並不是真的將資料刪除掉了,只是標識資料為刪除狀態而已,驗證 SQL 和執行結果如下圖所示:
在 InnoDB 引擎中,使用了 delete 刪除所有的資料之後,並不會重置自增列為初始值,我們可以通過以下命令來驗證一下:
truncate 執行效果和 delete 類似,也是用來刪除表中的所有行資料的,它的使用語法如下:
truncate [table] table_name
truncate 在使用上和 delete 最大的區別是,delete 可以使用條件表示式刪除部分資料,而 truncate 不能加條件表示式,所以它只能刪除所有的行資料,比如以下 truncate 新增了 where 命令之後就會報錯:
truncate 看似只刪除了行資料,但它卻是 DDL 語句,也就是 Data Definition Language 資料定義語言,它是用來維護儲存資料的結構指令,所以這點也是和 delete 命令是不同的,delete 語句屬於 DML,Data Manipulation Language 資料操縱語言,用來對資料進行操作的。
為什麼 truncate 只是刪除了行資料,沒有刪除列資料(欄位和索引等資料)卻是 DDL 語言呢?
這是因為 truncate 本質上是新建了一個表結構,再把原先的表刪除掉,所以它屬於 DDL 語言,而非 DML 語言。
truncate 在 InnoDB 引擎中會重置自增列,如下命令所示:
drop 和前兩個命令只刪除表的行資料不同,drop 會把整張表的行資料和表結構一起刪除掉,它的語法如下:
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [,tbl_name]
其中 TEMPORARY 是臨時表的意思,一般情況下此命令都會被忽略。
drop 使用範例如下:
delete、truncate 可用於刪除表中的行資料,而 drop 是把整張表全部刪除了,刪除的資料包含所有行資料和欄位、索引等資料,其中 delete 刪除的資料可以被恢復,而 truncate 和 drop 是不可恢復的,但在執行效率上,後兩種刪除方式又有很大的優勢,所以要根據實際場景來選擇相應的刪除命令,當然 truncate 和 drop 這些不可恢復資料的刪除方式使用的時候也要小心。
是非審之於己,譭譽聽之於人,得失安之於數。
公眾號:Java面試真題解析