insert on duplicate key update多个唯一索引踩坑

4 篇文章 0 订阅

insert on duplicate key update多个唯一索引踩坑

insert into … on duplicate key update 这个语义的逻辑是,插入一行数据,如果碰到唯一键约束,就执行后面的更新语句。

这里需要注意的是:如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

如果该表中,由多个唯一索引,需要特别注意,出现重复时则该语句只能更新其中一行记录

举例:表test_tbl有如下数据,但是有两个唯一索引:UNIQUE KEY a (a) USING BTREE,UNIQUE KEY b (b) USING BTREE

idabc
1aaaaaatest
2bbbbbbbbtest

执行insert into test_tbl(a, b) value(‘aaa’, ‘bbbb’) on duplicate key update c= ‘demo’;

结果是:

idabc
1aaaaaademo
2bbbbbbbbtest

可以看出,id=1和id=2两行都匹配到了,但是只更新了一行数据,受影响的行数为2。原因就是更新时会按照键的顺序来更新。(按索引被添加到表上的顺序排序)。因此在主从复制时会存在问题。

官方文档描述:MySQL Bugs: #58637: Mark INSERT…ON DUPLICATE KEY UPDATE unsafe when there is more than one key

CREATE TABLE t1 (a INT, b INT UNIQUE KEY) ENGINE = InnoDB;
ALTER TABLE t1 ADD UNIQUE KEY(a);
--sync_slave_with_master
# Same table definition, only given in one statement instead of two
DROP TABLE t1;
CREATE TABLE t1 (a INT UNIQUE KEY, b INT UNIQUE KEY) ENGINE = InnoDB;
--connection master

INSERT INTO t1 VALUES (1, 1);
INSERT INTO t1 VALUES (2, 2);
INSERT INTO t1 VALUES (1, 2)
    ON DUPLICATE KEY UPDATE a=VALUES(a)+10, b=VALUES(b)+10;
SELECT * FROM t1;
--sync_slave_with_master
SELECT * FROM t1;

Suggested fix:
Mark INSERT ... ON DUPLICATE KEY UPDATE unsafe when there are more than one indexes.
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值