主键列是否需要添加到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
相关产品推荐
相关产品推荐

