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

Python执行MySQL INSERT ON DUPLICATE KEY语句报语法错误求助

错误原因

你的SQL语法错误出在ON DUPLICATE KEY UPDATE子句的VALUES()函数使用不符合MySQL规范:

  • VALUES()括号内必须填写表的列名,不能传参数占位符。你写的VALUES(%s)会被Python的数据库驱动替换为传入的IP字符串,MySQL解析时遇到引号包裹的字符串值作为VALUES()的参数,就会抛出语法错误,和你看到的报错指向单引号包裹内容的现象完全吻合。
  • 逻辑上如果IPAddress是表的主键/唯一索引(这是ON DUPLICATE KEY UPDATE生效的前提),触发重复键冲突时IPAddress本身就是冲突的键值,不需要重复更新这个字段,你实际需要更新的是UnBlock字段。
修正后的代码

直接把执行语句替换为以下内容即可,不需要重复传入IP参数给UPDATE子句:

# 注意:请提前确认IPAddress字段已设置为主键或唯一索引,否则ON DUPLICATE KEY UPDATE逻辑不会触发
cursor.execute(
    "INSERT INTO blocked_ip (IPAddress, UnBlock) VALUES (%s, %s) ON DUPLICATE KEY UPDATE UnBlock = VALUES(UnBlock)",
    (i, '1')
)

修正后的逻辑:

  • 传入的IP不存在时,直接插入新记录,写入IP地址和UnBlock状态
  • 传入的IP已存在时,自动将对应记录的UnBlock字段更新为本次传入的'1',不会改动其他字段,也不会重复插入数据。
额外优化建议

如果要进一步贴合你“不删全量、仅更新变动数据”的优化目标,可以先查询出当前表中所有已存在的IP和UnBlock状态,和你最新拉取的数据集做差集比对,只针对新增IP、状态有变动的IP执行写入操作,比全量循环执行upsert语句性能更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:57:11