摘要:在本教程中,您將學習如何使用 SQL TRUNCATE TABLE 語句來高效、快速地刪除表中的所有資料。
SQL TRUNCATE TABLE 語句簡介 #
要刪除表中的所有資料,您可以使用不帶 WHERE 子句的 DELETE 語句。
DELETE FROM table_name;然而,對於包含大量資料的表,DELETE 語句在刪除所有行時速度較慢且效率不高。原因是資料庫系統可能需要為每一行單獨獲取鎖並寫入日誌。
為了減少鎖定和日誌記錄的開銷,您可以使用 TRUNCATE TABLE 語句。TRUNCATE TABLE 語句可以非常快速地刪除表中的所有資料。
以下是 TRUNCATE TABLE 語句的語法:
TRUNCATE TABLE table_name;Code language: SQL (Structured Query Language) (sql)在此語法中,您在 TRUNCATE TABLE 關鍵字後指定要刪除資料的 table_name(表名)。
一些資料庫系統(如 MySQL 和 PostgreSQL)允許您省略 TABLE 關鍵字,因此 TRUNCATE TABLE 語句可以簡化如下:
TRUNCATE table_name;Code language: SQL (Structured Query Language) (sql)當您發出 TRUNCATE TABLE 語句時,資料庫系統透過釋放表分配的資料頁來刪除表中的所有行。透過這樣做,資料庫系統可以減少日誌記錄和鎖定的資源消耗。
要一次性截斷多個表,您可以在 TRUNCATE TABLE 子句中指定一個用逗號分隔的表名列表:
TRUNCATE TABLE table_name1, table_name2, ...;Code language: SQL (Structured Query Language) (sql)並非所有資料庫系統都支援這種形式的 TRUNCATE TABLE 語句。如果您使用的系統不支援,則必須發出多個 TRUNCATE TABLE 語句來截斷多個表。
SQL TRUNCATE TABLE 語句示例 #
首先,建立一個名為 items 的新表:
CREATE TABLE items (
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
);Code language: SQL (Structured Query Language) (sql)其次,根據需要多次執行以下 INSERT 語句,以向 items 表中插入資料:
INSERT INTO
items (id)
VALUES
(DEFAULT);Code language: SQL (Structured Query Language) (sql)請注意,如果您使用的資料庫系統支援使用者自定義函式或儲存過程,您可以將此語句放入迴圈中。
例如,以下 PostgreSQL 中的過程會將由 n 引數指定的行數載入到 items 表中。
CREATE PROCEDURE load_data (n INT) AS $$
BEGIN
FOR i IN 1..n LOOP
INSERT INTO items(id) VALUES(DEFAULT);
END LOOP;
END;
$$ LANGUAGE plpgsqlCode language: SQL (Structured Query Language) (sql)以下語句呼叫 load_data 過程,向 items 表中插入 10,000 行資料。
CALL load_data(10000);Code language: SQL (Structured Query Language) (sql)第三,使用 TRUNCATE TABLE 語句截斷 items 表中的資料:
TRUNCATE TABLE items;Code language: SQL (Structured Query Language) (sql)SQL TRUNCATE TABLE 與 DELETE 語句的對比 #
下表比較了 SQL DELETE 和 TRUNCATE TABLE 語句:
| 方面 | DELETE | TRUNCATE TABLE |
|---|---|---|
| 目的 | 根據 WHERE 子句從表中刪除一行或多行。如果沒有 WHERE 子句,DELETE 語句也會刪除表中的所有行。 | 刪除表中的所有行。 |
| 條件刪除 | 允許在 WHERE 子句中指定條件以刪除特定行。 | 不支援條件。 |
| 事務支援 | 記錄刪除操作,並支援作為事務一部分的回滾。 | 提供非常少的日誌記錄。一些資料庫系統也支援在事務中回滾。 |
| 效能 | 較慢 | 較快 |
| 觸發器 | 觸發 DELETE 觸發器。 | 不觸發 DELETE 觸發器。一些資料庫系統支援 TRUNCATE 觸發器。 |
| 標識列重置 | 不重置標識列(自增列)的值。 | 將標識列的值重置為其種子值。 |
| 外部索引鍵約束 | 遵循外部索引鍵約束。 | 不能截斷被外部索引鍵引用的表。一些資料庫系統支援 CASCADE 選項,在截斷表之前刪除外部索引鍵約束。 |
| 用途 | 當您想根據條件刪除特定行或需要使用 DELETE 觸發器時。 | 當您需要快速刪除表中的所有資料時。 |
摘要 #
- 使用
TRUNCATE TABLE語句刪除表中的所有行。
測驗 #
資料庫 #
- PostgreSQL TRUNCATE TABLE 語句
- MySQL TRUNCATE TABLE 語句
- MariaDB TRUNCATE TABLE 語句
- Oracle TRUNCATE TABLE 語句
- SQL Server TRUNCATE TABLE 語句
- Db2 TRUNCATE TABLE 語句