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

Python3操作MySQL表去重更新时的SQL语法错误排查

问题分析与解决

1. SQL语句语法错误

你的SQL语句写法完全错误,ON DUPLICATE KEY UPDATE的语法逻辑搞混了:

  • 占位符%s应该放在INSERT的VALUES部分,而不是UPDATE后面
  • UPDATE部分需要明确写出要更新的字段,用VALUES(字段名)对应插入语句里的同名字段值
  • 原语句里多写了冗余的UserID = VALUES(UserID)和错误的VALUES(...)片段

修正后的SQL语句如下:

INSERT INTO Tokens (AccessToken, RefreshToken, UserID) 
VALUES (%s, %s, %s) 
ON DUPLICATE KEY UPDATE 
    AccessToken = VALUES(AccessToken), 
    RefreshToken = VALUES(RefreshToken)

对应的Python代码里,参数只需要三个值,不需要重复传UserID:

val = (AccessToken, RefreshToken, User_ID)

2. 主键/唯一键的前提要求

你怀疑主键问题是对的,ON DUPLICATE KEY UPDATE要生效,必须满足:
UserID字段是表的主键,或者被设置了唯一约束(UNIQUE)

如果UserID没有唯一约束,MySQL无法识别“重复键”,这个语法不会触发更新逻辑。可以用下面的SQL检查表结构:

-- 查看表字段和约束
DESCRIBE Tokens;
-- 查看索引信息
SHOW INDEX FROM Tokens;

如果没有唯一约束,执行以下语句添加:

ALTER TABLE Tokens ADD UNIQUE KEY (UserID);

修正后的完整代码

try:
    with conexion.cursor() as cursor:
        query = """
            INSERT INTO Tokens (AccessToken, RefreshToken, UserID)
            VALUES (%s, %s, %s)
            ON DUPLICATE KEY UPDATE
                AccessToken = VALUES(AccessToken),
                RefreshToken = VALUES(RefreshToken)
        """
        val = (AccessToken, RefreshToken, User_ID)
        cursor.execute(query, val)
    conexion.commit()
except Exception as e:
    print(f"执行错误: {e}")
    conexion.rollback()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:05:37