sqlite不支持truncate,清空单表用delete from table_name;重置自增id需额外delete from sqlite_sequence;清空全部数据可删库重建,开发测试环境推荐此法。

清空 SQLite 数据库的 DELETE FROM 和 TRUNCATE 区别
SQLite 不支持 TRUNCATE TABLE 语法,直接写会报错 near "TRUNCATE": syntax error。必须用 DELETE FROM table_name,但要注意它不会重置自增主键(INTEGER PRIMARY KEY)的计数器。
- 想清空单表且保留自增 ID 下一个值从 1 开始 → 用
DELETE FROM table_name+DELETE FROM sqlite_sequence WHERE name='table_name' - 只删数据、不碰元数据 → 单纯
DELETE FROM table_name就够了,但后续插入 ID 会接着上次最大值+1 - 清空所有表?别手写几十个
DELETE,用脚本生成或换更彻底的方式
用 sqlite3 命令行一键清空整个数据库文件
最彻底的办法其实是删除并重建数据库文件——尤其适合开发/测试环境。SQLite 的数据库就是单个文件,没服务端进程锁着,删了就真没了。
- 确认路径:
ls -l /path/to/app.db,别删错成生产库 - 安全做法:
rm /path/to/app.db,然后让应用下次启动时自动重建(前提是你的初始化逻辑完整) - 如果应用不自动建表,得手动执行 schema SQL:
sqlite3 /path/to/app.db - 注意:这个操作不可逆,没有事务、不走 WAL,也不触发任何触发器或外键检查
在 Python 中用 sqlite3 模块安全清空多张表
用 Python 批量清空时,别用字符串拼接表名,防止 SQL 注入;也别忽略外键约束导致的报错。
- 先关外键检查:
cursor.execute("PRAGMA foreign_keys = OFF") - 查出所有用户表:
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%'") - 对每个表执行:
cursor.execute(f"DELETE FROM `{table}`")(用反引号包裹表名,兼容含中划线或关键字的表名) - 清空后重置自增计数器:
cursor.execute("DELETE FROM sqlite_sequence")(清空全部)或按表逐个删 - 最后开回外键:
cursor.execute("PRAGMA foreign_keys = ON")
为什么不用 DROP TABLE + CREATE TABLE 代替 DELETE
看起来等价,但实际有坑:表结构可能带 WITHOUT ROWID、严格模式、CHECK 约束、索引、触发器——这些都不会被 CREATE TABLE 语句自动还原,除非你完整导出 schema。
立即学习“前端免费学习笔记(深入)”;
-
DROP TABLE会丢失所有关联对象(索引、触发器),而DELETE不影响它们 - 如果表有
FOREIGN KEY引用,DROP可能失败,除非先关 pragma 或按依赖顺序删 - 某些 ORM(如 Django 的
manage.py flush)底层仍是DELETE+ 重置sqlite_sequence,不是删表 - 真正需要“结构重置”时,应该用
sqlite3的.dump导出再过滤重建,而不是现场拼CREATE
sqlite_sequence 表和外键 pragma 的开关时机,一漏就导致后续 ID 错乱或语句静默失败。










