在本教學中,我們來學習如何使用SQL TRUNCATE TABLE
語句高效,快速地刪除表中的所有數據。
1. 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
語句來截斷多個表。
2. SQL TRUNCATE TABLE與DELETE
邏輯上,TRUNCATE TABLE
語句和不帶WHERE
子句的DELETE
語句提供了從表中刪除所有數據的相同效果。 但是,它們確實存在一些差別:
使用
DELETE
語句時,資料庫系統會記錄操作。 通過一些努力,可以回滾已刪除的數據。 但是,當使用TRUNCATE TABLE
語句時,除非在尚未提交的事務中使用它,否則無法回滾。要從外鍵約束引用的表中刪除數據,不能使用
TRUNCATE TABLE
語句。 在這種情況下,必須使用DELETE
語句。如果表具有與之關聯的觸發器,則
TRUNCATE TABLE
語句不會觸發delete
觸發器。- 執行
TRUNCATE TABLE
語句後,某些資料庫系統會將自動增量列(或標識,序列等)的值重置為其起始值。DELETE
語句不是這種情況。 - 帶有
WHERE
子句的DELETE
語句從表中刪除部分數據,而TRUNCATE TABLE
語句始終從表中刪除所有數據。
3. SQL 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
語句之間的差異。