SQLite3中自增主键归零方法

本文介绍了如何在SQLite数据库中将自增列的序号归零的方法。通过更新或删除sqlite_sequence表中的记录来实现这一目标。对于需要重置整个数据库自增列的应用场景提供了直接清空sqlite_sequence表的操作指南。

当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。
这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。
如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName';
也可以直接把该记录删掉:
DELETE FROM sqlite_sequence WHERE name='TableName';
要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了:
DELETE FROM sqlite_sequence;

当然可以!✅ **SQLite 完全支持自主键(Autoincrement Primary Key)**,而且使用非常简单。 --- ## ✅ 方法一:使用 `INTEGER PRIMARY KEY AUTOINCREMENT`(推荐用于持久化 ID) ```sql CREATE TABLE my_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER ); ``` ### 🔍 特点: | 特性 | 说明 | |------|------| | 📈 自动递 | 每插入一行,`id` 自动加 1 | | 🔢 唯一且非空 | 不允许重复或 NULL | | 🧱 真正的自 | 即使删除过记录,也不会重用最大值之后的 ID | | 💡 底层实现 | 使用一个叫 `sqlite_sequence` 的系统表来跟踪最大 ID | ### ✅ 示例插入: ```python query = QSqlQuery() query.exec_("INSERT INTO my_table (name, age) VALUES ('Alice', 25)") # 此时 id 会自动分配为下一个可用整数(如 1, 2, 3...) ``` 你可以通过 `lastInsertId()` 获取刚插入的 ID: ```python last_id = query.lastInsertId() # PyQt 中有效 print(f"新记录的 ID 是: {last_id}") ``` > ⚠️ 注意:`AUTOINCREMENT` 关键字在大多数情况下不是必须的 —— 下面会解释区别。 --- ## ✅ 方法二:使用 `INTEGER PRIMARY KEY`(隐式 ROWID,更高效) ```sql CREATE TABLE my_table ( id INTEGER PRIMARY KEY, name TEXT, age INTEGER ); ``` ### 🔍 特点: - SQLite 内部每张表都有一个隐藏的 `ROWID`(64位整数),作为物理存储顺序标识。 - 当你声明 `INTEGER PRIMARY KEY` 时,这个列就是 `ROWID` 的别名。 - 插入时不指定 `id`,它会自动分配比当前最大值大 1 的整数。 - **性能更好**,因为不需要查询 `sqlite_sequence` 表。 📌 大多数场景下,这种方法已经足够了,除非你有特殊需求要防止 ID 重用。 --- ## ❗ `AUTOINCREMENT` 的真正含义(很多人误解) 加上 `AUTOINCREMENT` 并不会让“自”更快或更可靠。它的唯一作用是: > 🔒 **防止重用曾经出现过的最大 ID** 例如: - 插入三条数据:id=1,2,3 - 删除 id=3 的记录 - 再插入新数据: - ❌ 没有 `AUTOINCREMENT`:可能复用 id=3 - ✅ 有 `AUTOINCREMENT`:一定用 id=4(永远不会回到 3) 👉 所以只有当你**绝对不允许 ID 回退或重复**时才需要加 `AUTOINCREMENT`。 否则建议只用: ```sql id INTEGER PRIMARY KEY ``` --- ## ✅ 实际建表建议(结合你的业务) 假设你要创建一个带层级标题和名称的表,并希望有自主键: ```sql CREATE TABLE project_data ( id INTEGER PRIMARY KEY, "一级标题" TEXT, "二级标题" TEXT, "三级标题" TEXT, "四级标题" TEXT, "五级标题" TEXT, "名称" TEXT ); ``` 然后插入数据时无需关心 `id`: ```python sql = ''' INSERT INTO project_data ("一级标题", "二级标题", "名称") VALUES (?, ?, ?) ''' query = QSqlQuery() query.prepare(sql) query.addBindValue("第一章") query.addBindValue("第一节") query.addBindValue("知识点A") if query.exec_(): new_id = query.lastInsertId() print(f"✅ 成功插入,ID={new_id}") ``` --- ## ✅ 如何检查是否启用了自? 查看系统表: ```sql -- 查看所有序列(即 AUTOINCREMENT 表的最大 ID) SELECT * FROM sqlite_sequence; ``` 如果你用了 `AUTOINCREMENT`,这里会有记录;如果只是 `PRIMARY KEY`,也可能没有条目。 --- ## ✅ 总结对比表 | 方式 | 语法 | 是否推荐 | 适用场景 | |------|------|----------|-----------| | ✅ 高效主键 | `id INTEGER PRIMARY KEY` | ✅ 推荐 | 一般用途,性能好 | | 🔐 严格自 | `id INTEGER PRIMARY KEY AUTOINCREMENT` | ⚠️ 按需使用 | 要求永不重复 ID | | ❌ 普通字段 | `id INTEGER` | ❌ 不推荐 | 无法保证唯一性和自 | --- ## ✅ 最佳实践建议 1. **每个表都应该有一个主键 `id INTEGER PRIMARY KEY`** 2. **除非必要,不要加 `AUTOINCREMENT`** 3. **用 `lastInsertId()` 获取新插入的 ID** 4. **在 Qt 中用 `QSqlQuery::lastInsertId()` 获取最新 ID** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值