Python向MySQL表插入单个字段报错:userid无默认值
问题解决:MySQL插入单字段报错「Field 'userid' doesn't have a default value」
核心原因
你的USER表中userid是主键字段,MySQL主键默认强制NOT NULL,且你没给它设置默认值。插入数据时必须为主键赋值,不能只插入s_id这一个字段,这是数据库的约束规则,绕不开。
可行解决方案
1. 插入时同时提供userid的值
直接在插入语句中补充主键userid的有效值(必须唯一):
cursor.execute("SELECT * FROM SONG") result = cursor.fetchall() sname = str(input("What is the name of the song you are looking for: ")) for row in result: title = row[0] if(title == sname): # 插入语句添加userid字段 sql = "INSERT INTO USER (userid, s_id) VALUES (%s, %s)" # 替换为实际的唯一用户ID(比如用户输入或自动生成) user_id = input("Enter user ID (3 chars): ") val = (user_id, row[1]) cursor.execute(sql, val)
2. 修改表结构让userid自动生成
如果不想手动输入userid,可以修改表结构让它自动生成(注意CHAR类型不适合自增,建议换成INT或用UUID):
-- 先删除原主键,再修改字段为自增INT ALTER TABLE USER DROP PRIMARY KEY; ALTER TABLE USER MODIFY userid INT AUTO_INCREMENT PRIMARY KEY;
之后插入时就可以只传s_id,userid会自动递增生成。
3. 调整业务逻辑:改用PLAYLIST表存储关联
从你的代码逻辑看,你是想关联用户和歌曲,但USER表是存储用户基础信息的,用户和歌曲的关联关系应该放在PLAYLIST表(这才是中间关联表的作用):
cursor.execute("SELECT * FROM SONG") result = cursor.fetchall() sname = str(input("What is the name of the song you are looking for: ")) for row in result: title = row[0] if(title == sname): # 插入到PLAYLIST表,维护用户和歌曲的关联 sql = "INSERT INTO PLAYLIST (p_id, userid, s_id) VALUES (%s, %s, %s)" # 生成唯一的播放列表ID,替换为实际用户ID playlist_id = "P05" user_id = "U02" val = (playlist_id, user_id, row[1]) cursor.execute(sql, val)
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

