Delete vs Truncate vs Drop

在資料表操作中,常用的SQL包括droptruncatedelete,它們都與清空或刪除資料相關,但各有不同。

  1. drop:資料表完成刪除,包含結構跟內容,如果你不想要資料表時可以使用。
  2. truncate:保留資料表的欄位結構,但清空裡面的資料。
  3. delete:保留資料表的欄位結構,與 truncate 一樣可以刪除全部資料或只刪除符合你設定的篩選條件資料。

drop

刪除 animals 資料表,執行以後資料庫裡面將不再看到animals資料表。

drop table animals;

delete

比較常使用在刪除部分符合條件的資料,執行後資料庫一樣會有animals 資料表,但符合where篩選條件的資料會刪除。如下所示animals 資料表 id 欄位小於等於 500刪除掉。

delete from animals where id <= 500;

DELETE 亦可用於清空資料表,但效能方面比下面要介紹的 truncate 差,如下所示不加入 WHERE 篩選條件,即可清空資料表資料。

delete from animals;

truncate

清除資料表內資料,保留資料表的結構,如下範例一樣是清空資料表。

truncate table animals;

詳細比較truncatedelete清空資料。

使用truncate清空資料後,再插入資料,ID會重新從1開始遞增;而使用delete則會繼續原有的ID序列。此外,truncate會完整釋放硬碟空間,而delete則視不同資料庫系統而定,可能會或可能不會釋放硬碟空間。

資料表內如果有自動遞增ID(插入資料時id欄位自動加1的欄位),該欄位使用truncate 清空以後再重新插入資料,將重新開始id再由1開始遞增。

如果使用delete 原本最後的ID是1000的話,使用delete 清空完資料以後再次插入資料,ID會由1001開始,不會重新由1開始。

可以知道的是truncate 完整釋放硬碟空間,delete 則視底層版本不同,會釋放或不會釋放硬碟空間,也就是使用Delete 如果是用在MySQL這個資料庫有可能會有兩種情況發生。

Victor
Victor

哈囉!

文章: 233

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *