MySQL非主键字段实现INSERT或UPDATE(避免双查询)
解决方案
要实现基于非主键字段Ticker的批量插入或更新(不影响自增字段),核心是利用INSERT ... ON DUPLICATE KEY UPDATE的特性——它不仅对主键冲突生效,唯一键冲突同样会触发更新逻辑,具体步骤如下:
1. 给Ticker字段添加唯一约束
首先需要确保Ticker字段是唯一的,这样MySQL才能识别重复数据并触发更新。执行以下SQL语句添加唯一索引:
ALTER TABLE `param_forex` ADD UNIQUE INDEX idx_ticker (`Ticker`);
注意:如果表中已有重复的
Ticker值,这条语句会执行失败,需要先清理重复数据后再操作。
2. 修改批量插入语句,加入更新逻辑
将原有的executemany语句修改为包含ON DUPLICATE KEY UPDATE的版本,当Ticker重复时自动更新Price字段:
mycursor.executemany( f"INSERT INTO `param_forex` (Ticker, Price) VALUES (%(symbol)s, %(price)s) " "ON DUPLICATE KEY UPDATE Price = VALUES(Price)", forex )
VALUES(Price)表示引用当前插入语句中Price列对应的值(即传入字典里的price);- 这种方式不会删除原有行,仅更新指定字段,完全不会影响表中的自增主键。
效果验证
对于你提供的forex数据:
- 如果某个
symbol对应的Ticker在表中不存在,会执行插入操作; - 如果
Ticker已存在,则会用新的price覆盖原有Price值,自增字段保持不变。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

