SQLite3报错UNIQUE constraint failed: currentMonthStocks.id如何解决
错误根本原因
- 你的函数注释明确说明执行逻辑是先删除当月旧数据再插入新数据,但代码完全没有实现删除旧数据的步骤。第一次函数执行成功插入id从1开始的记录后,后续每次执行id都从1开始赋值,和表中已有的主键id冲突,直接触发UNIQUE约束报错。
- 你当前测试使用的是每8秒执行一次的定时配置,函数触发频率极高,只要第一次执行成功,后续所有执行都会出现主键冲突。
- 你使用
INSERT OR IGNORE INTO时没有数据插入,是因为相同id的插入请求被约束规则直接忽略,你认为目标表为空大概率是手动清空表后,定时任务已经先执行过一次插入了数据,你未及时查询到。
修复步骤
- 插入前先清理旧数据,在获取数据库连接后、插入循环之前添加删除逻辑:
# 二选一即可:如果不需要保留历史数据直接清空表 c.execute("DELETE FROM currentMonthStocks") # 如果需要保留历史数据只删除当月旧记录,使用下面的语句 # c.execute("DELETE FROM currentMonthStocks WHERE month = ?", (this_month_int,)) conn.commit()
- 主键id无需手动维护,修改表结构为自增主键,避免手动管理id出现重复问题:
把你注释的建表语句中id字段修改为:
id INTEGER PRIMARY KEY AUTOINCREMENT
插入时不需要传递id参数,修改插入语句为:
c.execute("""INSERT INTO currentMonthStocks (symbol, month) VALUES (?, ?)""", (this_months_symbols[i], this_month_int))
- 调试阶段先注释掉8秒间隔的定时任务,手动调用
get_symbols_at_month_start验证插入逻辑正常后,再换回每月执行的配置,避免频繁重复执行引发冲突。
内容的提问来源于stack exchange,提问作者Will Powers
相关产品推荐
相关产品推荐

