Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mysql insert or update与UQ索引

mysql insert or update与UQ索引

作者头像
兜兜毛毛
发布于 2020-10-26 09:07:12
发布于 2020-10-26 09:07:12
1.9K00
代码可运行
举报
文章被收录于专栏:兜兜毛毛兜兜毛毛
运行总次数: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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何防止MySQL重复插入数据,这篇文章会告诉你
写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
用户5546570
2020/09/21
1K0
insert...on duplicate key update语法
这样的操作乍一看没有什么问题,但是仔细分析分析,还是有些瓶颈的,目前来看,我能分析到的瓶颈有两个,
AsiaYe
2019/11/06
2.6K0
面试官:MySQL 唯一索引为什么会导致死锁?
insert ignore会忽略数据库中已经存在的数据(根据主键或者唯一索引判断),如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.
蜗牛互联网
2022/10/31
1.8K0
【MySQL】005.MySQL表的约束(上)
真正约束字段的是数据类型,但数据类型约束很单一,需要一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。
_孙同学
2025/04/23
1270
【MySQL】005.MySQL表的约束(上)
故障分析 | MySQL:唯一键约束失效
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
爱可生开源社区
2022/04/06
1.8K0
故障分析 | MySQL:唯一键约束失效
MySQL实战中,Insert语句的使用心得总结
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里
陈哈哈
2021/10/13
1.6K0
分享7种MySQL的进阶用法
还只会使用SQL进行简单的insert、update、detele吗?今天给大家带来7种SQL的进阶用法,让大家在平常工作中使用SQL简化复杂的代码逻辑。
小熊学Java
2024/03/25
1470
分享7种MySQL的进阶用法
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.5K0
MySQL中特别实用的几种SQL语句送给大家
高能预警,这是一篇干货满满的MySQL技术文章,总有一天,你必然会用到,记得收藏! -- 来自一位被技术经理毒打多年的程序员的忠告
陈哈哈
2020/07/03
1.2K0
MySQL中insertOrUpdate的功能如何实现的
insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢?
@派大星
2024/06/08
6950
MySQL中insertOrUpdate的功能如何实现的
Mysql - insert into on duplicate key update 异常探究
场景: 向表admin插入一条数据,如果business_id字段如果有重复的,则is_update置为1
夹胡碰
2021/06/11
1.9K0
mysql批量新增数据_word修改内容目录怎么更新
注:insert into values 或 insert into select批量插入时,都满足事务的原子性与一致性,一条出错整体都会回滚。在使用insert into select时,MySQL会对select的数据加S(读)锁,在事务较为复杂的场景下可能有死锁的风险,下篇博客会总结。
全栈程序员站长
2022/11/08
3K0
MySQL唯一索引重复插入数据解决方案总结
在日常开发中,我们会经常遇到某一张表中某列或者多列的值是唯一的,不能重复插入同一个值。遇到这样的设计,我们一般会设置一个unique的索引。也就是在要求值不能是重复的列或者多列上添加一个唯一索引。例如,会执行这一条SQL语句:
兔云小新LM
2021/07/18
5.9K0
MySQL唯一索引重复插入数据解决方案总结
数据库SQL小技巧大揭秘:IGNORE选项让你的数据处理更从容
在 MySQL 中,IGNORE 是一种在插入或更新数据时处理冲突的选项。具体来说,在 INSERT | UPDATE 语句中,IGNORE 的作用是在插入或更新数据时忽略特定的错误,而不导致整个操作失败。另外,IGNORE 选项还可以在非空约束、写入的字段内容超过字段长度时进行截断处理等,下面是几个具体的例子。
俊才
2023/11/30
5420
数据库SQL小技巧大揭秘:IGNORE选项让你的数据处理更从容
Mysql INSERT ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。当发现有重复的唯一索引(unique key)或者主键(primary key)的时候,会进行更新操作;如果没有,那么执行插入操作。
霸王猪
2018/07/19
5K0
Mysql INSERT ON DUPLICATE KEY UPDATE
MySQL 锁(5)
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
兜兜毛毛
2020/11/24
6580
MySQL 锁(5)
技术分享 | 原来 pt-osc 改表是这样实现的!原理详解【附场景案例】
自工作以来就开始接触 pt-osc[1],至今差不多 8 年了,过去那么多次接触都只是停留在使用及简单了解原理,并没有对原理进行更深的思考,简而言之就是没有吃透其原理,后面使用改表平台以后,连编写 pt-osc 命令都省去了,感觉更加的生疏了,趁着这次机会就来梳理总结一下。
爱可生开源社区
2024/09/14
2380
技术分享 | 原来 pt-osc 改表是这样实现的!原理详解【附场景案例】
MySQL常见的索引失效场景
索引创建和删除语句如下,方便大家自己进行其他测试,建议自己将所有语句运行一边,使用explain + 查询语句看看运行计划,加深一边印象
天下之猴
2024/09/11
1640
MySQL常见的索引失效场景
SQL 稍复杂一点语法的学习笔记
最近整理我手写的笔记, 其中有不少内容随着时代的变化, 用得越来越少了, 抑或是电子化了发到了我的博文中。然而我发现我当年学习的 SQL 笔记, 只电子化了特别基础和简单的 一篇, 后面还有一些躺在纸上。既然有点时间, 那我就把那些内容也都整理一下发上来吧。
amc
2024/10/26
2520
SQL 稍复杂一点语法的学习笔记
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
在实际业务场景中,经常会有这样的需求:插入一条记录,如果数据表中已经存在该条记录则更新它的部分字段,比如更新update_time或者在某些列上执行累加操作等。参考博客1中介绍了三种在MySQL中避免重复插入记录的方法,本文将在简单介绍这三种用法的基础上,深入分析这其各自存在的问题,最后给出在实际生产环境中对该业务场景的最佳实践。
saintyyu
2021/11/22
2.5K1
IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践
推荐阅读
相关推荐
如何防止MySQL重复插入数据,这篇文章会告诉你
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验