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

主键列是否需要添加到ON DUPLICATE KEY UPDATE语句中?

关于ON DUPLICATE KEY UPDATE中主键字段的处理建议

结论:完全不需要在ON DUPLICATE KEY UPDATE后添加col1和col2的更新语句

原因很直接:

  • col1和col2是主键,本身带有唯一性约束,触发ON DUPLICATE KEY UPDATE的前提就是这俩字段的组合已经存在于表中。这时候写col1 = col1、col2 = col2属于纯冗余操作——主键值本来就和现有记录一致,改了等于没改,还平白拉长了语句。
  • 而且主键字段在业务逻辑里基本不允许修改(就算语法不报错,也违背主键的设计初衷),所以这种写法既无意义也没必要。

优化后的代码示例

更合理的写法是只更新非主键字段,还可以用VALUES()函数直接引用INSERT语句里对应字段的值,比重复传参更简洁:

with Dl.cursor() as cursor:
    # 把chunk转成批量插入的元组列表,减少循环次数
    for chunk in np.array_split(DataFrame, 10, axis=0):
        data = [tuple(row) for row in chunk[['col1', 'col2', 'col3', 'col4']].values]
        sql = """
            INSERT INTO table_example (col1, col2, col3, col4) 
            VALUES (%s, %s, %s, %s) 
            ON DUPLICATE KEY UPDATE 
                col3 = VALUES(col3), 
                col4 = VALUES(col4);
        """
        # 用executemany批量执行,比循环单条execute效率高很多
        cursor.executemany(sql, data)
        Dl.commit()
Dl.close()

额外提个优化点:原代码每循环一次就commit一次,效率极低。改成批量插入后再提交,能大幅提升插入速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:35:35