SQLite - TRUNCATE 命令
SQLite - 如何清空(Truncate)表
Section titled “SQLite - 如何清空(Truncate)表”与其他一些 SQL 数据库不同,SQLite 没有专门的 TRUNCATE TABLE 命令。然而,您可以使用标准的 DELETE 命令实现相同的目标——删除表中的所有行。对于现代 SQLite 版本,此操作经过了高度优化。
主要方法:使用 DELETE
Section titled “主要方法:使用 DELETE”从表中删除所有行的标准且最安全的方法是使用不带 WHERE 子句的 DELETE 语句。
-- 删除指定表中的所有行DELETE FROM table_name;现代 SQLite 版本包含一个“清空优化”(truncate optimization)。当 DELETE 语句没有 WHERE 子句且表没有触发器时,SQLite 会使用一种更高效的内部机制来擦除整个表的内容,这比逐行删除要快得多。
DELETE 与 DROP TABLE 的区别
Section titled “DELETE 与 DROP TABLE 的区别”理解删除行和完全删除表之间的区别很重要。
- DELETE FROM table_name;:这是一条数据操作语言(DML)命令。它删除所有行,但保留表结构,包括其模式(schema)、索引(indexes)和约束(constraints)。此操作可以在事务(transaction)中回滚(rolled back)。它本身不会重置
AUTOINCREMENT计数器。 - DROP TABLE table_name;:这是一条数据定义语言(DDL)命令。它会从数据库中完全移除表及其所有数据、索引和模式。若要再次使用该表,必须从头开始
CREATE(创建)它。这通常不是您想要“清空”表时所指的操作。
重置 AUTOINCREMENT 计数器
Section titled “重置 AUTOINCREMENT 计数器”开发者寻找 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 回收未使用的空间
Section titled “使用 VACUUM 回收未使用的空间”删除大量数据后,数据库文件可能包含空页,导致磁盘空间未被使用。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;-- (没有返回行)