在本教學中,我們來學習如何使用SQL TRUNCATE TABLE
語句高效,快速地刪除表中的所有資料。
要刪除表中的所有資料,可使用不帶WHERE
子句的DELETE
語句。 但是對於具有幾百萬行的大表,DELETE
語句很慢且效率不高。
要快速刪除大表中的所有行,使用以下TRUNCATE TABLE
語句:
TRUNCATE TABLE table_name;
在此語法中,指定要在TRUNCATE TABLE
子句後刪除資料的table_name
。
某些資料庫系統(如MySQL和PostgreSQL)允許直接省略TABLE
關鍵字,因此TRUNCATE TABLE
語句如下所示:
TRUNCATE table_name;
發出TRUNCATE TABLE
語句時,資料庫系統通過取消分配表分配的資料頁來刪除表中的所有行。 通過這樣做,RDBMS可以減少紀錄檔記錄的資源和需要獲取的鎖的數量。
如果要一次截斷多個表,可以在TRUNCATE TABLE
子句後使用逗號分隔的表名列表,如下所示:
TRUNCATE TABLE table_name1, table_name2, ...;
並非所有資料庫系統都支援這種使用TRUNCATE TABLE
語句來一次刪除多個表。 如果不使用,則要發出多個TRUNCATE TABLE
語句來截斷多個表。
邏輯上,TRUNCATE TABLE
語句和不帶WHERE
子句的DELETE
語句提供了從表中刪除所有資料的相同效果。 但是,它們確實存在一些差別:
使用DELETE
語句時,資料庫系統會記錄操作。 通過一些努力,可以回滾已刪除的資料。 但是,當使用TRUNCATE TABLE
語句時,除非在尚未提交的事務中使用它,否則無法回滾。
要從外來鍵約束參照的表中刪除資料,不能使用TRUNCATE TABLE
語句。 在這種情況下,必須使用DELETE
語句。
如果表具有與之關聯的觸發器,則TRUNCATE TABLE
語句不會觸發delete
觸發器。
TRUNCATE TABLE
語句後,某些資料庫系統會將自動增量列(或標識,序列等)的值重置為其起始值。 DELETE
語句不是這種情況。WHERE
子句的DELETE
語句從表中刪除部分資料,而TRUNCATE TABLE
語句始終從表中刪除所有資料。下面我們來看一個截斷表的例子。
首先,建立一個名為big_table
的新表,如下所示:
CREATE TABLE big_table (
id INT AUTO_INCREMENT PRIMARY KEY,
val INT
);
其次,如果要將樣本資料插入big_table
表,請多次執行以下語句:
INSERT INTO big_table (val)
VALUES
(RAND(100000));
請注意,如果使用支援儲存過程的資料庫系統,則可以將此語句放在迴圈中。 例如,MySQL中的以下儲存過程將資料載入到big_table
表中,其中包含num
引數指定的行數。
DELIMITER $$
CREATE PROCEDURE load_big_table_data(IN num int)
BEGIN
DECLARE counter int default 0;
WHILE counter < num DO
INSERT INTO big_table(val)
VALUES(RAND(1000000));
END WHILE;
END$$
以下語句呼叫load_big_table_data
儲存過程將999999
行資料插入到big_table
表。
CALL load_big_table_data(999999)
第三,要刪除big_table
中所有資料,請使用以下語句:
TRUNCATE TABLE big_table;
如上所見,TRUNCATE TABLE
語句的速度有多快。
現在我們已經學習了如何使用TRUNCATE TABLE
語句來快速刪除大表中的所有資料,並理解TRUNCATE TABLE
和DELETE
語句之間的差異。