前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql - insert into on duplicate key update 异常探究

Mysql - insert into on duplicate key update 异常探究

作者头像
夹胡碰
发布2021-06-11 18:09:19
1.7K0
发布2021-06-11 18:09:19
举报
文章被收录于专栏:程序猿~程序猿~
1. 背景

场景: 向表admin插入一条数据,如果business_id字段如果有重复的,则is_update置为1

  • create_sql
代码语言:javascript
复制
CREATE TABLE `admin` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `business_id` bigint(20) DEFAULT NULL COMMENT '业务id',
  `name` varchar(64) NOT NULL DEFAULT '' COMMENT '名称',
  `is_update` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否修改 0否 1是',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_name` (`name`),
  UNIQUE KEY `uk_business_id` (`business_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='测试表';
2. 执行sql
代码语言:javascript
复制
insert into admin(business_id) values (12345) on duplicate key update is_update = 1;
3. 发现问题

表中business_id12345的重复数据,执行之后发现执行成功,但是该数据的is_update并没有改变。

4. 过程分析

发现因为name字段是唯一索引,并且默认填充为'',所以只插入business_id,表中已经存在name为''的数据就会造成name重复导致插入失败,而这个插入失败并不是business_id字段重复造成的,所以就没有is_update字段的更改。

  • 由此分析出

  1. unique key的异常级别高于duplicate key的重复判断。执行过程是先确保insert语句可执行,之后再判断duplicate key
  2. insert操作异常反馈的重复字段如果不在sql中,则不会执行后续的update
5. 解决办法

在执行insert duplicate key语句的时候,尽量使用主键作为判断,主键的重复判断优先级比其他字段的unique key优先级高,所以在执行插入重复的时候能正常触发update

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 背景
  • 2. 执行sql
  • 3. 发现问题
  • 4. 过程分析
  • 5. 解决办法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档