Skip to content

SQLite - TRUNCATE 命令

与其他一些 SQL 数据库不同,SQLite 没有专门的 TRUNCATE TABLE 命令。然而,您可以使用标准的 DELETE 命令实现相同的目标——删除表中的所有行。对于现代 SQLite 版本,此操作经过了高度优化。

从表中删除所有行的标准且最安全的方法是使用不带 WHERE 子句的 DELETE 语句。

-- 删除指定表中的所有行
DELETE FROM table_name;

现代 SQLite 版本包含一个“清空优化”(truncate optimization)。当 DELETE 语句没有 WHERE 子句且表没有触发器时,SQLite 会使用一种更高效的内部机制来擦除整个表的内容,这比逐行删除要快得多。

理解删除行和完全删除表之间的区别很重要。

  • DELETE FROM table_name;:这是一条数据操作语言(DML)命令。它删除所有行,但保留表结构,包括其模式(schema)、索引(indexes)和约束(constraints)。此操作可以在事务(transaction)中回滚(rolled back)。它本身不会重置 AUTOINCREMENT 计数器。
  • DROP TABLE table_name;:这是一条数据定义语言(DDL)命令。它会从数据库中完全移除表及其所有数据、索引和模式。若要再次使用该表,必须从头开始 CREATE(创建)它。这通常不是您想要“清空”表时所指的操作。

开发者寻找 TRUNCATE 的一个常见原因是重置 AUTOINCREMENT 主键列(通常是 INTEGER PRIMARY KEY)。在 DELETE 之后,序列会从上次结束的地方继续。要重置它,您必须对内部的 sqlite_sequence 表执行额外步骤。

-- 步骤 1:删除表中的所有数据
DELETE FROM COMPANY;
-- 步骤 2:重置 COMPANY 表的自增计数器
DELETE FROM sqlite_sequence WHERE name = 'COMPANY';

注意: sqlite_sequence 表只包含实际使用了 AUTOINCREMENT 功能的表的条目。如果您看到 0 行受影响,这是正常的。

删除大量数据后,数据库文件可能包含空页,导致磁盘空间未被使用。VACUUM 命令会重建整个数据库文件,从而清除这种碎片并减小文件大小。

-- 建议在大规模删除后运行以回收磁盘空间
VACUUM;

假设我们有一个 COMPANY 表。以下是清空表、重置其主键序列并回收磁盘空间的完整工作流程。

-- 表的原始状态
SELECT * FROM COMPANY;
-- ID | NAME | AGE | ADDRESS | SALARY
-- ---|-------|-----|------------|--------
-- 1 | Paul | 32 | California | 20000.0
-- 2 | Allen | 25 | Texas | 15000.0
-- 开始一个事务以确保安全
BEGIN TRANSACTION;
-- 从表中删除所有行
DELETE FROM COMPANY;
-- 重置自增计数器
DELETE FROM sqlite_sequence WHERE name = 'COMPANY';
-- 提交更改
COMMIT;
-- 回收未使用的空间(可选,在事务外部运行)
VACUUM;
-- 现在,COMPANY 表为空,任何新条目都将从 ID 1 开始。
SELECT * FROM COMPANY;
-- (没有返回行)