Python操作SQLite3时能否自定义autoincrement自增主键的起始值
SQLite3修改AUTOINCREMENT自增主键起始值方案
这个需求完全可以实现,SQLite的自增主键序列规则支持自定义起始值,操作逻辑如下:
实现原理
使用INTEGER PRIMARY KEY AUTOINCREMENT声明的主键,对应的自增序列会被记录在SQLite内置的sqlite_sequence系统表中:
- 该表的
name字段对应业务表的表名 seq字段存储当前业务表已使用的最大主键值,下次插入数据时会自动在该值基础上加1作为新的主键值
操作步骤
情况1:业务表未插入过数据
建表后手动向sqlite_sequence插入对应业务表的记录,seq值设置为你期望的起始值减1即可,比如要从2011开始,就设置seq=2010。
情况2:业务表已有历史数据
直接更新sqlite_sequence中对应业务表的seq值即可,注意设置的seq值需要大于表中已有的最大主键值,否则设置不会生效,SQLite会自动取两者的最大值作为下次自增的基数,避免主键冲突。
Python3代码示例
import sqlite3 # 连接本地数据库文件 db_conn = sqlite3.connect("demo.db") cursor = db_conn.cursor() # 1. 创建带自增主键的业务表 cursor.execute(""" CREATE TABLE IF NOT EXISTS demo_table ( id INTEGER PRIMARY KEY AUTOINCREMENT, data TEXT NOT NULL ) """) # 2. 设置自增主键起始值为2011,所以seq配置为2010 # INSERT OR REPLACE 避免重复插入报错 cursor.execute(""" INSERT OR REPLACE INTO sqlite_sequence (name, seq) VALUES ('demo_table', 2010) """) # 测试插入3条数据 test_data = [("测试1",), ("测试2",), ("测试3",)] cursor.executemany("INSERT INTO demo_table (data) VALUES (?)", test_data) db_conn.commit() # 验证结果,输出应为 [(2011, '测试1'), (2012, '测试2'), (2013, '测试3')] cursor.execute("SELECT * FROM demo_table") print(cursor.fetchall()) db_conn.close()
注意事项
- 只有声明了
AUTOINCREMENT的自增主键才会使用sqlite_sequence表记录序列,不带AUTOINCREMENT的INTEGER PRIMARY KEY自增逻辑不依赖该系统表,上述方案不适用 - 禁止直接修改
sqlite_sequence表中不属于当前业务表的记录,可能会导致其他表的主键序列异常
内容的提问来源于stack exchange,提问作者Tommy
相关产品推荐
相关产品推荐

