首页 > 其他分享 >INSERT ... ON DUPLICATE KEY UPDATE 问题记录

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

时间:2024-09-07 14:48:27浏览次数:6  
标签:INSERT ... UPDATE id DUPLICATE VALUES KEY col

起因:
需要新增复制数据并更新原数据状态,故采用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

标签:INSERT,...,UPDATE,id,DUPLICATE,VALUES,KEY,col
From: https://www.cnblogs.com/lycheeeeeee/p/18401665

相关文章