Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql insert or update与UQ索引

mysql insert or update与UQ索引

作者头像
兜兜毛毛
发布于 2020-10-26 09:07:12
发布于 2020-10-26 09:07:12
2K00
代码可运行
举报
文章被收录于专栏:兜兜毛毛兜兜毛毛
运行总次数:0
代码可运行

在项目过程中因需要大批量数据的insert or update操作,为了减少应用程序的校验逻辑,所以使用了mysql 的特殊语法insert into … on duplicate key update。用于解决出现相同的主键执行update ,不同主键执行新增。

在测试过程中发现一个小坑,在网上的技术文档中都写的是(当记录中有PrimaryKey或者unique索引的话,如果数据库已经存在数据,则用新数据更新)当时理解错误,理解成会按其中一种进行处理。

实际情况是mysql会先使用UQ更新,如果没有UQ然后才用PK更新。所以我遇到了因为UQ相同,PK不同导致触发了数据的update导致数据错误。

下边增加一个测试说明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建测试表
drop table if EXISTS `insert_or_update`;
CREATE TABLE `insert_or_update` (
  `id` int(5) NOT NULL auto_increment,
  `code` varchar(40) not null ,
  `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  `age` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`),
  unique index (`code`) comment '唯一编码'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;


# 初始化数据
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(1,'code1','名字1',10);
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(2,'code2','名字2',10);
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(3,'code3','名字3',10);
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4',10);
mysql insert or update 共有4重方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1.  insert ignore into(重复则忽略,不重复则插入)

# 主键重复
insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4',10);
# UQ重复
insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code4','名字4',10);
# 不重复直接插入
insert ignore into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字4',10);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 2.  replace into  (重复则先删除再插入新记录,不重复则插入)

# 主键重复
replace into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4 replace',10);
# UQ重复
replace into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字5 replace',10);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 3.  insert into … on duplicate key update(重复则更新指定字段,不重复则插入)

# 主键重复
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(4,'code4','名字4 duplicate key update',10)
    on duplicate key update name = values(`name`);

# UQ重复
insert into `insert_or_update` (`id`,`code`,`name`,`age`) values(5,'code5','名字5 duplicate key update',10)
    on duplicate key update name = values(`name`);

注意:当一个表同时有UQ与PK时一定注意避免掉坑。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
insert into,insert ignore into, on duplicate key update,replace into-唯一键约束
当MySQL表字段设置unique key或者primary key时,被约束的字段就必须是唯一的。新插入数据直接使用insert into,如果出现唯一性冲突,就会抛出异常。我们可以根据需求选择合适的插入语句。
IT工作者
2022/01/10
6300
MySQL 锁(5)
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
兜兜毛毛
2020/11/24
6700
MySQL 锁(5)
面试官:MySQL 唯一索引为什么会导致死锁?
insert ignore会忽略数据库中已经存在的数据(根据主键或者唯一索引判断),如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.
蜗牛互联网
2022/10/31
1.9K0
insert...on duplicate key update语法
这样的操作乍一看没有什么问题,但是仔细分析分析,还是有些瓶颈的,目前来看,我能分析到的瓶颈有两个,
AsiaYe
2019/11/06
2.7K0
MySQL实战中,Insert语句的使用心得总结
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
陈哈哈
2021/10/13
1.7K0
mysql 唯一索引_mysql主键和唯一索引的区别
普通索引(INDEX):最基本的索引,没有任何限制 唯一索引(UNIQUE):与”普通索引”类似,不同的就是:索引列的值必须唯一,但允许有空值。 主键索引(PRIMARY):它 是一种特殊的唯一索引,不允许有空值。 全文索引(FULLTEXT ):可用于 MyISAM 表,mysql5.6之后也可用于innodb表, 用于在一篇文章中,检索文本信息的, 针对较大的数据,生成全文索引很耗时和空间。 联合(组合)索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
全栈程序员站长
2022/11/05
3.4K0
如何防止MySQL重复插入数据,这篇文章会告诉你
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
用户5546570
2020/09/21
1K0
MySQL唯一索引重复插入数据解决方案总结
在日常开发中,我们会经常遇到某一张表中某列或者多列的值是唯一的,不能重复插入同一个值。遇到这样的设计,我们一般会设置一个unique的索引。也就是在要求值不能是重复的列或者多列上添加一个唯一索引。例如,会执行这一条SQL语句:
兔云小新LM
2021/07/18
6K0
MySQL唯一索引重复插入数据解决方案总结
关于MySQL中insert ignore,insert on duplicate和replace into,你可能没想过区别
在数据流转中或者日常的数据操作中,势必会有数据写入的过程,如果把一些数据写入一张数据库表中,如果写入量有100万,而重复的数据有90万,那么如何让这10%的数据能够更高更高效的写入。
jeanron100
2020/02/13
3.9K0
mysql批量新增数据_word修改内容目录怎么更新
注:insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,一条出错整体都会回滚。在使用insert into select时,MySQL会对select的数据加S(读)锁,在事务较为复杂的场景下可能有死锁的风险,下篇博客会总结。
全栈程序员站长
2022/11/08
3.1K0
Mysql - insert into on duplicate key update 异常探究
场景: 向表admin插入一条数据,如果business_id字段如果有重复的,则is_update置为1
夹胡碰
2021/06/11
2K0
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
在实际业务场景中,经常会有这样的需求:插入一条记录,如果数据表中已经存在该条记录则更新它的部分字段,比如更新update_time或者在某些列上执行累加操作等。参考博客1中介绍了三种在MySQL中避免重复插入记录的方法,本文将在简单介绍这三种用法的基础上,深入分析这其各自存在的问题,最后给出在实际生产环境中对该业务场景的最佳实践。
saintyyu
2021/11/22
2.7K1
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
mysql技巧:如果记录存在则更新/如果不存在则插入的三种处理方法
新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。
菩提树下的杨过
2018/12/21
10.2K0
MySQL INSERT的4种形态
墨墨导读:MySQL中常用的四种插入数据的语句: insert ,insert select,replace into,insert into on duplicate key update,以下详述这四种插入数据的语句,希望可以帮助到大家。
数据和云
2020/08/11
1.7K0
MySQL数据库编程基础入门2
描述:学习MySQL除了一些基本的SQL语句以外,我们还需要学习MySQL扩展部分的知识;通过前面的学习我们知道SQL类型大致分为四类,在后面的学习采用这四类来入门了解使用MySQL 8.0;
全栈工程师修炼指南
2022/09/29
1.6K0
MySQL数据库编程基础入门2
Mysql INSERT ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。当发现有重复的唯一索引(unique key)或者主键(primary key)的时候,会进行更新操作;如果没有,那么执行插入操作。
霸王猪
2018/07/19
5.1K0
Mysql INSERT ON DUPLICATE KEY UPDATE
MySQL 插入数据时如何不插入重复的数据
针对一些基础业务数据如用户表,要保证主键Primary或Unique不重复,如果在插入时做判断,效率低且代码复杂。
IT工作者
2021/12/30
8.1K0
【MySQL】005.MySQL表的约束(上)
真正约束字段的是数据类型,但数据类型约束很单一,需要一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
_孙同学
2025/04/23
1560
【MySQL】005.MySQL表的约束(上)
Mysql之多种 Insert语句
我们试图插入一条name=test2,classNum=21的数据,但是test2在数据库中主键已经存在,那么使用replace语句执行插入后,会发现,主键为test2的值仍然存在,但是classNum替换为了21.
呼延十
2019/06/26
1.1K0
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/12/31
1.2K0
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4
推荐阅读
相关推荐
insert into,insert ignore into, on duplicate key update,replace into-唯一键约束
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验