插入数据触发IntegrityError:my_films.title_id唯一约束失败求助
排查IntegrityError: UNIQUE constraint failed: my_films.title_id的问题
我来帮你分析下这个错误的可能原因,以及对应的解决办法:
1. 数据元组格式错误(最可能的直接诱因)
先看你的films列表里的后两个条目:
(3, 'Love Rosie', 2014, 7,6), (4, 'Me Before You', 2016, 7,2)
这里你用逗号分隔了评分的整数和小数部分(比如7,6),导致这两个元组变成了5个元素,而不是INSERT语句要求的4个元素(对应title_id、title、premiered、rating四个字段)。
当executemany执行时,SQLite会错误解析这些多出来的元素,可能把它们当作新行的title_id,进而出现重复的ID值,触发唯一约束失败的错误。
2. 重复执行代码导致表中已有数据
如果你多次运行这段代码,第一次执行时已经成功插入了title_id为1、2、3、4的数据:
- 再次运行
CREATE TABLE时,SQLite会报错(因为表已存在),但如果你的代码跳过了这个错误(比如在交互式环境中只运行了插入部分),直接执行插入操作,就会因为已有相同的title_id而触发唯一约束错误。
解决步骤
第一步:修复数据格式错误
把评分里的逗号改成小数点,确保每个元组都是4个元素:
films = [(1, 'Birds of Prey', 2020, 9), (2, 'The Avengers', 2012, 10), (3, 'Love Rosie', 2014, 7.6), (4, 'Me Before You', 2016, 7.2)]
第二步:避免重复插入数据
如果需要重新运行代码,建议先清空或重建表,避免已有数据干扰:
# 先删除已存在的表(如果有) cur.execute("DROP TABLE IF EXISTS my_films") # 重新创建表 cur.execute("""CREATE TABLE my_films ( title_id INT, title TEXT, premiered INT, rating REAL, PRIMARY KEY (title_id))""") con.commit() # 执行插入 cur.executemany("INSERT INTO my_films VALUES (?, ?, ?, ?)", films) con.commit()
第三步:可选——提前验证ID唯一性
如果担心后续还有重复ID的问题,可以在插入前先检查表中已有的title_id:
cur.execute("SELECT title_id FROM my_films") existing_ids = [row[0] for row in cur.fetchall()] for film_id, _, _, _ in films: if film_id in existing_ids: print(f"发现重复的title_id:{film_id},请修改后再插入")
这样应该就能解决你遇到的问题了。
内容的提问来源于stack exchange,提问作者jassiiccaa2020
相关产品推荐
相关产品推荐

