文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  TRUNCATE TABLE 陳述式

15.1.37 TRUNCATE TABLE 陳述式

TRUNCATE [TABLE] tbl_name

TRUNCATE TABLE 會完全清空資料表。它需要 DROP 權限。從邏輯上來說,TRUNCATE TABLE 類似於刪除所有列的 DELETE 陳述式,或是 DROP TABLECREATE 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 值都會重設為其起始值。即使對於通常不重複使用序列值的 MyISAMInnoDB 也是如此。

  • 當與分割資料表一起使用時,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 位置,並將檔案放入預設的資料目錄位置。已知目錄是由 datadirinnodb_data_home_dirinnodb_directories 變數所定義。若要讓 TRUNCATE TABLE 在其目前位置建立表格空間,請在執行 TRUNCATE TABLE 之前,將目錄新增至 innodb_directories 設定。