TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE
會完全清空資料表。它需要 DROP
權限。從邏輯上來說,TRUNCATE TABLE
類似於刪除所有列的 DELETE
陳述式,或是 DROP TABLE
和 CREATE TABLE
陳述式序列。
為了實現高效能,TRUNCATE TABLE
會繞過刪除資料的 DML 方法。因此,它不會觸發 ON DELETE
觸發器,它不能對具有父子外鍵關係的 InnoDB
資料表執行,而且它無法像 DML 操作一樣回滾。但是,如果伺服器在執行 TRUNCATE TABLE
操作期間停止,則使用支援原子 DDL 的儲存引擎的資料表上的 TRUNCATE TABLE
操作,要么完全提交,要么回滾。如需更多資訊,請參閱第 15.1.1 節「原子資料定義陳述式支援」。
雖然 TRUNCATE TABLE
類似於 DELETE
,但它被歸類為 DDL 陳述式,而不是 DML 陳述式。它與 DELETE
的不同之處如下:
截斷操作會捨棄並重新建立資料表,這比逐一刪除列快得多,尤其是對於大型資料表。
截斷操作會導致隱式提交,因此無法回滾。請參閱第 15.3.3 節「導致隱式提交的陳述式」。
如果工作階段持有作用中的資料表鎖定,則無法執行截斷操作。
如果其他資料表有任何參照該資料表的外鍵約束,則
TRUNCATE TABLE
對於InnoDB
資料表或NDB
資料表會失敗。允許相同資料表欄位之間的外鍵約束。截斷操作不會傳回已刪除列數的有意義值。通常的結果是 「影響 0 列,」應將其解釋為 「沒有資訊。」
只要資料表定義有效,即使資料或索引檔案已損壞,也可以使用
TRUNCATE TABLE
將資料表重新建立為空的資料表。任何
AUTO_INCREMENT
值都會重設為其起始值。即使對於通常不重複使用序列值的MyISAM
和InnoDB
也是如此。當與分割資料表一起使用時,
TRUNCATE TABLE
會保留分割;也就是說,資料和索引檔案會被捨棄並重新建立,而分割定義不受影響。TRUNCATE TABLE
陳述式不會叫用ON DELETE
觸發器。支援截斷損壞的
InnoDB
資料表。
為了進行二進位記錄和複寫,TRUNCATE TABLE
被視為 DDL 而不是 DML,並且始終會記錄為陳述式。
TRUNCATE TABLE
會關閉使用 HANDLER OPEN
開啟之資料表的所有處理常式。
TRUNCATE TABLE
可以與效能架構摘要資料表一起使用,但其作用是將摘要欄位重設為 0 或 NULL
,而不是移除列。請參閱第 29.12.20 節「效能架構摘要資料表」。
截斷位於每個資料表檔案表格空間中的 InnoDB
資料表會捨棄現有的表格空間並建立一個新的表格空間。如果使用較早版本建立表格空間,且該表格空間位於不明的目錄中,則 InnoDB
會在預設位置建立新的表格空間,並在錯誤記錄檔中寫入以下警告:DATA DIRECTORY 位置必須位於已知的目錄中。將忽略 DATA DIRECTORY 位置,並將檔案放入預設的資料目錄位置。已知目錄是由 datadir
、innodb_data_home_dir
和 innodb_directories
變數所定義。若要讓 TRUNCATE TABLE
在其目前位置建立表格空間,請在執行 TRUNCATE TABLE
之前,將目錄新增至 innodb_directories
設定。