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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:10:16