MySQL Connector/Python插入数据遇1364错误及修改表失败求助
解决MySQL employees表插入时emp_no无默认值及外键约束问题
问题分析
你遇到的两个错误存在直接关联:
1364错误:插入数据时未指定emp_no字段值,且该字段无默认值,MySQL拒绝执行插入操作。1833错误:emp_no是dept_manager等子表的外键关联字段,直接修改主表字段属性会破坏外键约束,因此被MySQL阻止。
方案一:修改表结构为自增主键(推荐长期使用)
要将emp_no改为自增,需先临时禁用外键检查,操作步骤如下:
- 登录MySQL命令行客户端,执行命令禁用外键检查:
SET FOREIGN_KEY_CHECKS = 0; - 修改
employees表的emp_no字段为自增主键:ALTER TABLE employees MODIFY emp_no INT NOT NULL AUTO_INCREMENT; - 重新启用外键检查:
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
相关产品推荐
相关产品推荐

