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

MySQL Connector/Python插入数据遇1364错误及修改表失败求助

解决MySQL employees表插入时emp_no无默认值及外键约束问题

问题分析

你遇到的两个错误存在直接关联:

  • 1364错误:插入数据时未指定emp_no字段值,且该字段无默认值,MySQL拒绝执行插入操作。
  • 1833错误:emp_no是dept_manager等子表的外键关联字段,直接修改主表字段属性会破坏外键约束,因此被MySQL阻止。

方案一:修改表结构为自增主键(推荐长期使用)

要将emp_no改为自增,需先临时禁用外键检查,操作步骤如下:

  1. 登录MySQL命令行客户端,执行命令禁用外键检查:
    SET FOREIGN_KEY_CHECKS = 0;
    
  2. 修改employees表的emp_no字段为自增主键:
    ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT;
    
  3. 重新启用外键检查:
    SET FOREIGN_KEY_CHECKS = 1;
    

修改完成后,后续插入数据时无需指定emp_no,MySQL会自动生成递增的数值。

方案二:插入时手动指定emp_no值(无需改表结构)

如果不想修改表结构,可以在插入前查询当前employees表的最大emp_no,将其加1作为新记录的emp_no。Python代码示例如下:

import mysql.connector
from mysql.connector import errorcode

# 你的数据库配置
config = {
    'user': '你的用户名',
    'password': '你的密码',
    'host': '127.0.0.1',
    'database': 'employees',
    'raise_on_warnings': True
}

try:
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    # 获取当前最大emp_no
    cursor.execute("SELECT MAX(emp_no) FROM employees")
    max_emp_no = cursor.fetchone()[0]
    new_emp_no = max_emp_no + 1

    # 构造插入语句,显式指定emp_no
    add_employee = ("INSERT INTO employees "
                    "(emp_no, birth_date, first_name, last_name, gender, hire_date) "
                    "VALUES (%s, %s, %s, %s, %s, %s)")
    employee_data = (new_emp_no, '1980-01-01', 'John', 'Doe', 'M', '2024-01-01')
    cursor.execute(add_employee, employee_data)
    cnx.commit()
    print("插入成功")

except mysql.connector.Error as err:
    print(f"错误信息: {err}")
finally:
    if 'cnx' in locals() and cnx.is_connected():
        cursor.close()
        cnx.close()

注意事项

  • 方案一修改自增后,原数据集的emp_no不会受影响,新插入的记录会从现有最大emp_no开始递增。
  • 方案二在高并发场景下可能出现主键冲突(多个请求同时获取相同的max_emp_no),但本地测试环境完全适用。

内容的提问来源于stack exchange,提问作者David Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 06:03:27