在 SQLite 中,没有 TRUNCATE TABLE 命令。
TRUNCATE TABLE是 MySQL / PostgreSQL / SQL Server 的特性,SQLite 不支持。
替代方案:快速清空表
方法 1:DELETE FROM 表名;(推荐)
DELETE FROM users;
最常用,效果等同于
TRUNCATE,但 不会重置自增 ID。
方法 2:清空表 + 重置自增 ID
DELETE FROM users;
DELETE FROM sqlite_sequence WHERE name = 'users';
sqlite_sequence是 SQLite 自动维护的自增计数器表
删除对应行 → 下次INSERT从1开始
方法 3:重建表(最快,适合大表)
-- 1. 创建空新表(结构相同)
CREATE TABLE users_temp AS SELECT * FROM users WHERE 0 = 1;
-- 2. 替换旧表
DROP TABLE users;
ALTER TABLE users_temp RENAME TO users;
-- 3. 重建索引/触发器(必须手动)
CREATE INDEX idx_users_email ON users(email);
速度最快(尤其是大表),因为不写 WAL 日志
缺点:需手动重建索引、触发器、外键
三种方法对比
| 方法 | 速度 | 重置 ID | 保留索引/触发器 | 事务安全 | 推荐场景 |
|---|---|---|---|---|---|
DELETE | 中等 | ❌ | ✅ | ✅ | 日常使用 |
DELETE + sqlite_sequence | 中等 | ✅ | ✅ | ✅ | 需要重置 ID |
| 重建表 | 最快 | ✅ | ❌ | ⚠️ 需注意 | 大表、性能敏感 |
完整示例:清空并重置 ID
-- 开始事务(推荐)
BEGIN TRANSACTION;
DELETE FROM users;
-- 重置自增 ID
DELETE FROM sqlite_sequence WHERE name = 'users';
COMMIT;
验证是否重置:
INSERT INTO users (name) VALUES ('Alice');
-- 新 ID 为 1
额外技巧
1. 批量清空多个表
DELETE FROM users;
DELETE FROM orders;
DELETE FROM logs;
-- 统一重置 ID
DELETE FROM sqlite_sequence WHERE name IN ('users', 'orders', 'logs');
2. 禁用 WAL 模式加速(大表)
PRAGMA journal_mode = DELETE; -- 默认
-- 临时切换
PRAGMA journal_mode = TRUNCATE; -- 更快清空
-- 或
PRAGMA journal_mode = OFF; -- 最快,但风险高
3. 查看自增状态
SELECT * FROM sqlite_sequence;
-- 输出:
-- name | seq
-- users | 100
为什么 SQLite 没有 TRUNCATE?
| 原因 | 说明 |
|---|---|
| 设计简洁 | 避免复杂语法 |
DELETE 足够 | 功能可替代 |
| 灵活性 | 支持更精细控制(如 WHERE) |
总结:SQLite “TRUNCATE” 写法
-- 标准等效(推荐)
DELETE FROM 表名;
-- 重置 ID
DELETE FROM sqlite_sequence WHERE name = '表名';
或 极致性能(大表):
DROP TABLE 表名;
CREATE TABLE 表名 (...); -- 原始建表语句
-- 重新建索引
需要我帮你 生成某个表的「重建清空脚本」?
把 CREATE TABLE 语句发我即可!