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