SQL TRUNCATE 表格

摘要:在本教程中,你将学习如何使用 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

从逻辑上讲,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 TABLEDELETE 语句之间的差异。

本教程有帮助吗?