SQL TRUNCATE TABLE

摘要:在本教學中,您將學習如何使用 SQL TRUNCATE TABLE 陳述式,以有效率且快速的方式移除資料表中的所有資料。

SQL TRUNCATE TABLE 陳述式簡介

sql truncate table

若要刪除資料表中的所有資料,您可以使用不帶 WHERE 子句的 DELETE 陳述式。對於擁有數百萬列的大型資料表而言,DELETE 陳述式速度緩慢且效率不高。

若要快速刪除大型資料表中的所有列,您可以使用以下 TRUNCATE TABLE 陳述式

TRUNCATE TABLE table_name;Code language: SQL (Structured Query Language) (sql)

在這個語法中,您需要在 TRUNCATE TABLE 子句之後指定您要刪除資料的 table_name

某些資料庫系統,例如 MySQLPostgreSQL,允許您省略 TABLE 關鍵字,因此 TRUNCATE TABLE 陳述式可以簡化如下:

TRUNCATE table_name;Code language: SQL (Structured Query Language) (sql)

當您發出 TRUNCATE TABLE 陳述式時,資料庫系統會透過解除配置資料表所配置的資料頁面來刪除資料表中的所有列。透過這樣做,RDBMS 可以減少日誌記錄的資源,以及需要取得的鎖定數量。

若要一次截斷多個資料表,您可以在 TRUNCATE TABLE 子句之後使用以逗號分隔的資料表名稱清單,如下所示:

TRUNCATE TABLE table_name1, table_name2, ...;Code language: SQL (Structured Query Language) (sql)

並非所有資料庫系統都支援這種形式的 TRUNCATE TABLE 陳述式。如果您使用的系統不支援,您必須發出多個 TRUNCATE TABLE 陳述式來截斷多個資料表。

SQL TRUNCATE TABLE 與 DELETE 的比較

從邏輯上講,不帶 WHERE 子句的 TRUNCATE TABLE 陳述式和 DELETE 陳述式具有相同的效果,即移除資料表中的所有資料。然而,它們之間存在一些差異

  • 當您使用 DELETE 陳述式時,資料庫系統會記錄操作。透過一些努力,您可以還原被刪除的資料。但是,當您使用 TRUNCATE TABLE 陳述式時,您沒有機會還原,除非您在尚未提交的交易中使用它。
  • 若要從受外部索引鍵約束引用的資料表中刪除資料,您不能使用 TRUNCATE TABLE 陳述式。在這種情況下,您必須改用 DELETE 陳述式。
  • 如果資料表有相關的觸發程序,則 TRUNCATE TABLE 陳述式不會觸發刪除觸發程序。
  • 某些資料庫系統會在您執行 TRUNCATE TABLE 陳述式後,將自動遞增欄位(或身分、序列等)的值重設為其起始值。DELETE 陳述式則不會這樣。
  • 帶有 WHERE 子句的 DELETE 陳述式會從資料表中刪除部分資料,而 TRUNCATE TABLE 陳述式總是會移除資料表中的所有資料。

SQL TRUNCATE TABLE 範例

讓我們來看一個截斷資料表的範例。

首先,建立一個名為 big_table 的新資料表,如下所示:

CREATE TABLE big_table (
	id INT AUTO_INCREMENT PRIMARY KEY,
	val INT
);Code language: SQL (Structured Query Language) (sql)

其次,執行以下陳述式多次,以將範例資料 插入big_table 資料表中:

INSERT INTO big_table (val)
VALUES
	(RAND(100000));Code language: SQL (Structured Query Language) (sql)

請注意,如果您使用支援預存程序的資料庫系統,您可以將此陳述式放在迴圈中。例如,以下 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$$Code language: SQL (Structured Query Language) (sql)

以下陳述式會呼叫 load_big_table_data 預存程序,將 10,000 列資料插入到 big_table 資料表中。

CALL load_big_table_data(10000);Code language: SQL (Structured Query Language) (sql)

第三,若要從 big_table 中移除所有資料,您可以使用以下陳述式:

TRUNCATE TABLE big_table;Code language: SQL (Structured Query Language) (sql)

如您所見,TRUNCATE TABLE 陳述式非常快速。

現在您應該知道如何使用 TRUNCATE TABLE 陳述式快速刪除大型資料表中的所有資料,並且了解 TRUNCATE TABLEDELETE 陳述式之間的差異。

這個教學對您有幫助嗎?