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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端