TRUNCATE TABLE 語句
TRUNCATE [TABLE] tbl_name
TRUNCATE TABLE 語句徹底清空表。它須要 DROP 權限。從邏輯上講,TRUNCATE TABLE 相似於刪除全部行的 DELETE 語句,或者是 DROP TABLE 和 CREATE TABLE 語句的組合。
爲了實現高性能,TRUNCATE TABLE 繞過了刪除數據的 DML 方法。所以,它不會觸發 ON DELETE 觸發器,不能對具備父-子外鍵關係的 InnoDB 表執行此命令,也不能像 DML 操做那樣回滾。可是,若是服務器在操做期間中止,使用支持原子 DDL 的存儲引擎的表上的 TRUNCATE TABLE 操做將被徹底提交或回滾。
雖然 TRUNCATE TABLE 與 DELETE 相似,但它被歸爲 DDL 語句,而不是DML 語句。與 DELETE 有如下幾個不一樣之處:
● 截斷操做刪除並從新建立表,這比逐行刪除要快得多,特別是對於大型表。
● 截斷操做會致使隱式提交,所以沒法回滾。
● 若是會話有生效的表鎖定,則沒法執行截斷操做。
● 對於 InnoDB 或 NDB 表,若是有其餘表引用該表的 FOREIGN KEY 約束,TRUNCATE TABLE 命令就會失敗。容許在同一表的列之間進行外鍵約束。
● 截斷操做不會返回刪除的行數。一般的結果是「0行受影響」,這應該解釋爲「沒有信息」。
● 只要表定義有效,即便數據或索引文件已損壞,也可使用TRUNCATE TABLE 語句將表從新建立爲空表。
● 任何 AUTO_INCREMENT 值將被重置爲它的初始值。即便對於一般不重用序列值的 MyISAM 和 InnoDB 也是如此。
● 當與分區表一塊兒使用時,TRUNCATE TABLE 語句保留分區;也就是說,數據和索引文件被刪除並從新建立,而分區定義不受影響。
● TRUNCATE TABLE 語句不會引起 ON DELETE 觸發器。
● 支持截斷損壞的 InnoDB 表。
對一個表執行 TRUNCATE TABLE 語句,將關閉經過 HANDLER OPEN 對該表打開的全部句柄。
從二進制日誌記錄和複製的角度看,TRUNCATE TABLE 相似於 DROP TABLE後面緊跟 CREATE TABLE 語句,即 DDL 而不是 DML。這是由於,當使用InnoDB 和其餘事務存儲引擎時,若是事務隔離級別不容許基於語句的日誌記錄( READ COMMITTED 或 READ UNCOMMITTED ),則在使用STATEMENT 或 MIXED 日誌模式時,不會記錄和複製語句。可是,它仍然之前面描述的方式應用於使用 InnoDB 的副本。
在 MySQL5.7 及更早版本中,在一個具備巨大緩衝池和啓用innodb_adaptive_hash_index 的系統上,因爲刪除表的自適應哈希索引項時發生LRU掃描,TRUNCATE TABLE 操做可能會致使系統性能暫時降低。MySQL 8.0中 TRUNCATE TABLE 到 DROP TABLE 和 CREATE TABLE 的從新映射避免了 LRU 掃描的問題。
TRUNCATE TABLE 可用於性能架構摘要表,但其效果是將摘要列重置爲 0或 NULL,而不是刪除行。
截斷獨立表空間中的 InnoDB 表,將刪除現有表空間並建立一個新表空間。從 MySQL 8.0.21 開始,若是表空間是用早期版本建立的,而且位於一個未知的目錄中,InnoDB 會在默認的位置建立新的表空間,並在錯誤日誌中寫入以下警告:The DATA DIRECTORY location must be in a known directory. The DATA DIRECTORY location will be ignored and the file will be put into the default datadir location. 已知的目錄是由datadir、innodb_data_home_dir 和 innodb_directory 變量定義的目錄。要讓 TRUNCATE TABLE 在當前位置建立表空間,請在運行 TRUNCATE TABLE以前將目錄添加到 innodb_directory 設置中。