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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:00:56