You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:39:02