SQLite Truncate Table

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 自动维护的自增计数器表
删除对应行 → 下次 INSERT1 开始


方法 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 语句发我即可!

文章已创建 2326

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部