1. 程式人生 > 其它 >Mysql中Truncate用法詳解

Mysql中Truncate用法詳解

前言:

1.當我們想要清空某張表時,往往會使用truncate語句。大多時候我們只關心能否滿足需求,而不去想這類語句的使用場景及注意事項。本篇文章主要介紹truncate語句的使用方法及注意事項。

1.truncate使用語法
truncate的作用是清空表或者說是截斷表,只能作用於表。truncate的語法很簡單,後面直接跟表名即可,例如: truncate table tbl_name 或者 truncate tbl_name 。

執行truncate語句需要擁有表的drop許可權,從邏輯上講,truncate table類似於delete刪除所有行的語句或drop table然後再create table語句的組合。

為了實現高效能,它繞過了刪除資料的DML方法,因此,它不能回滾
。儘管truncate table與delete相似,但它被分類為DDL語句而不是DML語句。

2.truncate與drop,delete的對比(重要

上面說過truncate與delete,drop很相似,其實這三者還是與很大的不同的,下面簡單對比下三者的異同。

truncate與drop是DDL語句,執行後無法回滾;delete是DML語句,可回滾。
truncate只能作用於表;delete,drop可作用於表、檢視等。
truncate會清空表中的所有行,但表結構及其約束、索引等保持不變;drop會刪除表的結構及其所依賴的約束、索引等。
truncate會重置表的自增值;delete不會。
truncate不會啟用與表有關的刪除觸發器;delete可以。
truncate後會使表和索引所佔用的空間會恢復到初始大小;delete操作不會減少表或索引所佔用的空間,drop語句將表所佔用的空間全釋放掉。

TRUNCATE關鍵字用於完全清空一個表。其語法格式如下:

TRUNCATE [TABLE] 表名

其中,TABLE 關鍵字可省略。

例 1

新建表 tb_student_course,插入資料並查詢,SQL 語句和執行結果如下:

mysql> CREATE TABLE `tb_student_course` (
    -> `id` int(4) NOT NULL AUTO_INCREMENT,
    -> `name` varchar(25) NOT NULL,
    -> PRIMARY KEY (`id`)
    -> );
Query OK, 
0 rows affected (0.04 sec) mysql> INSERT INTO tb_student_course(name) VALUES ('Java'),('MySQL'),('Python'); Query OK, 3 rows affected (0.05 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM tb_student_course; +----+--------+ | id | name | +----+--------+ | 1 | Java | | 2 | MySQL | | 3 | Python | +----+--------+ 3 rows in set (0.00 sec)

使用 TRUNCATE 語句清空 tb_student_course 表中的記錄,SQL 語句和執行結果如下:

mysql> TRUNCATE TABLE tb_student_course;
Query OK, 0 rows affected (0.04 sec)

mysql> SELECT * FROM tb_student_course;
Empty set (0.00 sec)
TRUNCATE 和 DELETE 的區別(再次強調)
從邏輯上說,TRUNCATE 語句與 DELETE 語句作用相同,但是在某些情況下,兩者在使用上有所區別。
DELETE 是 DML 型別的語句;TRUNCATE 是 DDL 型別的語句。它們都用來清空表中的資料。
DELETE 是逐行一條一條刪除記錄的;TRUNCATE 則是直接刪除原來的表,再重新建立一個一模一樣的新表,而不是逐行刪除表中的資料,執行資料比 DELETE 快。
  因此需要刪除表中全部的資料行時,儘量使用 TRUNCATE 語句, 可以縮短執行時間。 DELETE 刪除資料後,配合事件回滾可以找回資料;TRUNCATE 不支援事務的回滾,資料刪除後無法找回。 DELETE 刪除資料後,系統不會重新設定自增欄位的計數器;TRUNCATE 清空表記錄後,系統會重新設定自增欄位的計數器。 DELETE 的使用範圍更廣,因為它可以通過 WHERE 子句指定條件來刪除部分資料;而 TRUNCATE 不支援 WHERE 子句,只能刪除整體。 DELETE 會返回刪除資料的行數,但是 TRUNCATE 只會返回
0,沒有任何意義。

3.truncate使用場景及注意事項
  通過前面介紹,我們很容易得出truncate語句的使用場景,即該表資料完全不需要時可以用truncate。

  如果想刪除部分資料用delete,注意帶上where子句;如果想刪除表,當然用drop;如果想保留表而將所有資料刪除且和事務無關,用truncate即可;

  如果和事務有關,或者想觸發trigger,還是用delete;如果是整理表內部的碎片,可以用truncate然後再重新插入資料。

無論怎樣,truncate表都是高危操作,特別是在生產環境要更加小心,下面列出幾點注意事項,希望大家使用時可以做下參考。

truncate無法通過binlog回滾。
truncate會清空所有資料且執行速度很快。
truncate不能對有外來鍵約束引用的表使用。
執行truncate需要drop許可權,不建議給賬號drop許可權。
執行truncate前一定要再三檢查確認,最好提前備份下表資料。