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

点击更新按钮更新MySQL pathology表时遇主键重复完整性错误

问题分析与解决

错误原因

你遇到的1062主键重复错误,核心问题有两个:

  • UPDATE语句缺少WHERE子句:不加WHERE会批量更新表中所有记录,把所有行的num(主键字段)改成同一个值,必然触发主键唯一性冲突。
  • 你试图将主键字段num修改为已存在的值430804,违反了主键全局唯一的约束。

解决方案

方案1:不修改主键(推荐,主键通常不应被修改)

如果num是表的主键,建议不要更新它,直接从UPDATE语句中移除num=%s,同时通过WHERE子句定位要修改的具体记录(比如基于原始主键值),最后别忘了提交事务:

def update(self):
    conn = mysql.connector.connect(host="localhost", user="root", password="root", database="pathology")
    my_cursor = conn.cursor()
    # 假设self.original_num存储了要修改记录的原始主键值
    sql = """
        UPDATE pathology 
        SET receivedate=%s,patientname=%s,pathologynum=%s,gender=%s,age=%s,
            inspechospital=%s,casenum=%s,specimenclass=%s,bed=%s,diagnosis=%s,
            clinicaldiagnose=%s,inspecdoctor=%s,pathologydoctor=%s,sampledate=%s,reportdate=%s
        WHERE num=%s
    """
    params = (
        self.var_rec_date.get(),
        self.var_patient_name.get(),
        self.var_path_num.get(),
        self.var_gender.get(),
        self.var_age.get(),
        self.var_sub_hospital.get(),
        self.var_case_num.get(),
        self.var_specimen_level.get(),
        self.var_bed.get(),
        self.var_diagnosis.get(),
        str(contents),                                                                         
        self.var_submit_doctor.get(),
        self.var_simple_date.get(),
        self.var_path_doc.get(),
        self.var_report_date.get(),
        self.original_num.get()  # 定位要修改的原始记录
    )
    my_cursor.execute(sql, params)
    conn.commit()  # 提交事务才会生效
    conn.close()

方案2:必须修改主键的情况

如果确实需要修改num字段,要先确保新的num值在表中不存在,同时通过WHERE子句定位原始记录:

def update(self):
    conn = mysql.connector.connect(host="localhost", user="root", password="root", database="pathology")
    my_cursor = conn.cursor()
    
    # 先检查新的num值是否已存在
    check_sql = "SELECT COUNT(*) FROM pathology WHERE num=%s"
    my_cursor.execute(check_sql, (self.var_sys_num.get(),))
    count = my_cursor.fetchone()[0]
    if count > 0:
        print("该编号已存在,无法修改")
        conn.close()
        return
    
    # 执行更新,定位原始记录
    update_sql = """
        UPDATE pathology 
        SET num=%s,receivedate=%s,patientname=%s,pathologynum=%s,gender=%s,age=%s,
            inspechospital=%s,casenum=%s,specimenclass=%s,bed=%s,diagnosis=%s,
            clinicaldiagnose=%s,inspecdoctor=%s,pathologydoctor=%s,sampledate=%s,reportdate=%s
        WHERE num=%s
    """
    params = (
        self.var_sys_num.get(),
        self.var_rec_date.get(),
        self.var_patient_name.get(),
        self.var_path_num.get(),
        self.var_gender.get(),
        self.var_age.get(),
        self.var_sub_hospital.get(),
        self.var_case_num.get(),
        self.var_specimen_level.get(),
        self.var_bed.get(),
        self.var_diagnosis.get(),
        str(contents),                                                                         
        self.var_submit_doctor.get(),
        self.var_simple_date.get(),
        self.var_path_doc.get(),
        self.var_report_date.get(),
        self.original_num.get()  # 原始主键值
    )
    my_cursor.execute(update_sql, params)
    conn.commit()
    conn.close()

额外提醒

  • 数据库操作后必须调用conn.commit()提交事务,否则修改不会写入数据库。
  • 建议添加异常捕获,避免程序崩溃:
def update(self):
    try:
        conn = mysql.connector.connect(host="localhost", user="root", password="root", database="pathology")
        my_cursor = conn.cursor()
        # 这里写SQL执行逻辑
        conn.commit()
    except mysql.connector.Error as e:
        print(f"数据库错误:{e}")
        conn.rollback()  # 出错时回滚事务
    finally:
        if conn.is_connected():
            my_cursor.close()
            conn.close()

内容的提问来源于stack exchange,提问作者Cat Ball

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:25