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
相关产品推荐
相关产品推荐

