Python向MySQL插入数据报错调试:主键重复问题求助
问题解决:pymysql.err.IntegrityError: (1062, "Duplicate entry '0' for key 'ref_info.PRIMARY'")
错误原因
你的插入SQL语句没有正确将Python变量的值传递给MySQL,而是直接把变量名写在了SQL字符串里。MySQL会将RefID、Ref_First_Name这些当作未知标识符,默认赋值为0,导致每次插入的主键都是0,触发主键唯一约束的重复错误。此外代码还存在变量更新顺序混乱、冗余操作等问题,以下是完整修正方案:
修正后的代码
import pymysql # 建立数据库连接 con = pymysql.Connect( host='localhost', port=3306, user='root', password='Musa2014', db='referees', charset='utf8' ) cur = con.cursor() RefID = 1 while True: Ref_Info = input("Enter referee details (输入Stop结束): ") if Ref_Info.strip().lower() == 'stop': break # 校验输入格式 try: Ref_First_Name, Ref_Last_Name, Ref_Level = Ref_Info.split() except ValueError: print("输入格式错误,请输入:名 姓 等级(例如:Josh Allen 2)") continue # 使用参数化查询传递变量 sql_query1 = 'INSERT INTO ref_info VALUES(%s, %s, %s, %s)' cur.execute(sql_query1, (RefID, Ref_First_Name, Ref_Last_Name, Ref_Level)) print(f"已添加裁判ID: {RefID}, 姓名: {Ref_First_Name} {Ref_Last_Name}, 等级: {Ref_Level}") RefID += 1 # 提交所有数据更改 con.commit() # 查询并打印表内所有数据 cur.execute('SELECT * FROM ref_info') data = cur.fetchall() print("\n当前ref_info表数据:") for row in data: print(row) # 关闭数据库资源 cur.close() con.close()
关键修正点
- 参数化查询:用
%s作为占位符,将Python变量作为第二个参数传递给cur.execute(),确保MySQL正确解析变量值,同时避免SQL注入风险。 - 调整循环逻辑:先获取输入再判断是否退出,避免初始输入的重复处理问题。
- 增加格式校验:捕获
split()的异常,提示用户输入正确格式。 - 优化提交时机:循环结束后统一提交,减少数据库交互次数。
- 移除冗余代码:删除不必要的列表存储和重复查询,简化逻辑。
内容的提问来源于stack exchange,提问作者Muhammad
相关产品推荐
相关产品推荐

