使用PyMySQL执行含ON DUPLICATE KEY UPDATE的SQL报错求助
问题排查与解决方案
语法错误原因
- SQL解析歧义:部分MariaDB版本对
ON DUPLICATE KEY与UPDATE分行的写法存在解析异常,触发1064语法错误。 - 缺少唯一约束:
ON DUPLICATE KEY UPDATE依赖表中存在唯一键或主键(通常是title字段),若未设置该约束,不仅子句无法生效,还可能引发解析层面的异常提示。
修复方案
1. 修正SQL语句
将ON DUPLICATE KEY与UPDATE合并为一行,消除解析歧义:
with conn.cursor() as cursor: sql = ''' INSERT INTO `Tag` (`title`,`weight`) VALUES (%s,%s) ON DUPLICATE KEY UPDATE title = VALUES(title), weight = VALUES(weight) ''' L1 = ['ins', 'ig', 'twitter', 'tiktok', 'ig'] # 用Counter高效统计频次,替代原有的去重+count写法 from collections import Counter count_result = Counter(L1) values = list(count_result.items()) cursor.executemany(sql, values) conn.commit()
2. 给表添加唯一约束
登录MariaDB执行以下SQL,为title字段添加唯一索引(如果title不是主键的话):
ALTER TABLE `Tag` ADD UNIQUE INDEX idx_tag_title (`title`);
额外优化说明
- 原代码用
set去重后再调用L1.count(item)的时间复杂度为O(n²),改用collections.Counter可将复杂度降至O(n),效率更高。 - 若
title已经是表的主键,无需重复添加唯一索引,主键本身具备唯一约束属性。
内容的提问来源于stack exchange,提问作者Jimmy Xee
相关产品推荐
相关产品推荐

