INSERT ... ON DUPLICATE KEY UPDATE 问题记录

起因:
需要新增复制数据并更新原数据状态,故采用INSERT ... ON DUPLICATE KEY UPDATE的方式来插入和更新数据

问题:
数据插入及更新异常

环境:
MySQL 5.7.32

数据表结构:

点击查看代码
CREATE TABLE `example_table` (
  `col_a` varchar(255) NOT NULL,
  `col_b` varchar(255) NOT NULL,
  `col_c` varchar(255) DEFAULT NULL,
  `_id` int NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`col_a`,`col_b`),
  UNIQUE KEY `inx_id` (`_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

场景复现:
原表中存在col_a='A',col_b='B',col_c='C',_id='1'的数据,现需要新增一条col_a='A',col_b='B1',col_c='C'的数据,且将原数据col_c字段更新为'C1'。
理想情况:
col_a='A',col_b='B',col_c='C1'
col_a='A',col_b='B1',col_c='C'
实际情况:
col_a='A',col_b='B',col_c='C1'

执行sql:

点击查看代码
INSERT INTO example_table
(`col_a`,`col_b`,`col_c`,`_id`) VALUES ('A','B1','C',1) ON DUPLICATE KEY UPDATE `col_a`=VALUES(`col_a`),`col_b`=VALUES(`col_b`),`col_c`=VALUES(`col_c`);
INSERT INTO example_table
(`col_a`,`col_b`,`col_c`,`_id`) VALUES ('A','B','C1',1) ON DUPLICATE KEY UPDATE `col_a`=VALUES(`col_a`),`col_b`=VALUES(`col_b`),`col_c`=VALUES(`col_c`);

分析:
发现因为_id为唯一索引,所以主键字段也被更新了~

结论:
如果INSERT ... ON DUPLICATE KEY UPDATE中插入的数据存在唯一索引的字段,则会根据唯一索引来更新字段,不论是否为主键字段

备注:
自增字段只能为主键或唯一索引,否则报错1075

posted @   离枝lychee  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示