摘要:在本教程中,你将学习如何使用 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
。
一些数据库系统(如 MySQL 和 PostgreSQL)允许你跳过 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
从逻辑上讲,TRUNCATE TABLE
语句和不包含 WHERE
子句的 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 TABLE
与 DELETE
语句之间的差异。