Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql Insert Or Update语法例子

Mysql Insert Or Update语法例子

作者头像
用户1154259
发布于 2018-01-17 06:42:55
发布于 2018-01-17 06:42:55
21.3K00
代码可运行
举报
运行总次数:0
代码可运行

有的时候会需要写一段insert的sql,如果主键存在,则update;如果主键不存在,则insert。Mysql中提供了这样的用法:ON DUPLICATE KEY UPDATE。下面就看看它是如何使用的吧!

首先数据库的原始数据如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a   b   c
1   b1  c1
2   b2  c2
3   b3  c3

此时如果执行下面的sql就会报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO test VALUES(1,'b4','c4');

报错信息如下,提示无法重复插入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 queries executed, 0 success, 1 errors, 0 warnings

查询:insert into test values(1,'b4','c4')

错误代码: 1062
Duplicate entry '1' for key 'PRIMARY'

执行耗时   : 0 sec
传送时间   : 0 sec
总耗时      : 0.008 sec

这时,就可以使用ON DUPLICATE KEY UPDATE,它的意思是先执行前面的Insert,如果主键重复,则执行后面的UPDATE

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c);

可以把上面的SQL简单的理解为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select count(1) from test where a=1;

if count(1) > 0

UPDATE test SET b='xxx',c='xxx' WHERE a=1;

执行完,可以看到有两行收到影响(至于为什么两行收到影响,就得研究底层的实现了,可以参考官方文档):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1 queries executed, 1 success, 0 errors, 0 warnings

查询:INSERT INTO test VALUES (1,'b4','c4') ON DUPLICATE KEY UPDATE b=VALUES(b),c=VALUES(c)2 行受到影响

执行耗时   : 0.023 sec
传送时间   : 0 sec
总耗时      : 0.023 sec

执行完,数据就变成下面的样子了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a   b   c
1   b4  c4
2   b2  c2
3   b3  c3
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
运维常用 mysql 语句
上周隔壁专题推送最后一篇Nginx文章(公众号出门左转 Nginx专题) ,从本周开始每周一推送MySql主题文章(Docker 主题每周四不变),文章内容均为运维方向相关,聚沙成塔,集腋成裘,第一篇文章讲一下运维工作中经常使用的 MySql 语句。
用户1560186
2019/12/19
1.6K0
MySQL避免插入重复记录的方法
mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。 1、insert ignore 2、replace into 3、insert on duplicate key update
IT工作者
2022/01/26
2.6K0
GreatSQL 中 Insert 慢是什么情况?
GreatSQL社区
2024/07/06
1200
GreatSQL 中 Insert 慢是什么情况?
MySQL insert or update sql
MySQL 一条 sql 实现数据保存变更 insert or update ,如果没有执行insert,有就update
全栈程序员站长
2022/11/15
3.1K0
insert...on duplicate key update语法
这样的操作乍一看没有什么问题,但是仔细分析分析,还是有些瓶颈的,目前来看,我能分析到的瓶颈有两个,
AsiaYe
2019/11/06
2.6K0
insert 语句加锁机制
之前的文章里面总结了很多死锁案例,其实里面有几篇文章对于insert加锁流程表述的不准确,而且微信公众号又无法修改,所以通过本文重新梳理insert加锁流程,最后加上一个死锁案例解析。
用户1278550
2018/08/09
3.3K0
MySQL复制问题的三个参数介绍
今天星期二,早上居然起晚了,上班迟到了,简直是。。。废话不多说,在昨天的文章中,我们提到了三个参数,分别是:
AsiaYe
2019/11/06
1.2K0
主从结构不一致复制问题验证
简介:高级数据库工程师,从事数据库行业近10年,从Oralce转战MySQL,擅长MySQL数据库性能优化、备份恢复、国产数据库迁移,对开源数据库相关技术有浓厚兴趣。
GreatSQL社区
2022/03/04
8360
Oracle连接字符串函数listagg()和wmsys.wm_concat()用法简介
介绍:其函数在Oracle 11g 版本中推出,对分组后的数据按照一定的排序进行字符串连接。
星哥玩云
2022/08/16
4K0
TiDB 源码阅读系列文章(十六)INSERT 语句详解
在之前的一篇文章 《TiDB 源码阅读系列文章(四)INSERT 语句概览》 中,我们已经介绍了 INSERT 语句的大体流程。为什么需要为 INSERT 单独再写一篇?因为在 TiDB 中,单纯插入一条数据是最简单的情况,也是最常用的情况;更为复杂的是在 INSERT 语句中设定各种行为,比如,对于 Unique Key 冲突的情况应如何处理:是报错?是忽略当前插入的数据?还是覆盖已有数据?所以,这篇会为大家继续深入介绍 INSERT 语句。
PingCAP
2018/08/20
1.5K0
MYSQL高级篇-----索引优化分析
由于有些mysql不能使用full join,不过可以换种方法表示 A 的独有 + AB 共有 + B的独有 union本身就可以去重 所以可以这样使用
默 语
2024/11/20
7130
MYSQL高级篇-----索引优化分析
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
在当今的大数据时代,数据库技术的选择对于企业的信息化发展至关重要。OceanBase作为一种高性能、高可用的分布式关系数据库,在与MySQL模式的兼容性方面展现出了显著的优势,为企业数据迁移、整合与升级提供了极大的便利。
公众号:码到三十五
2024/05/06
8730
深入OceanBase分布式数据库:MySQL 模式下的 SQL 基本操作
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悲观锁踩坑测试
今天遇到一个高并发悲观锁的问题,活跃连接堆积恶性循环最后DB卡死了。做下测试总结。看看这类SQL能扛多少,以后遇到问题心里也有底了。这是出问题前的截图,QPS继续涨连接就开始堆积了,SQL还是这些频率高了。还有一点TOP1的SQL有热点的行for update。
mingjie
2022/05/12
5360
Mysql悲观锁踩坑测试
MySQL索引优化深入
CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `c1` varchar(10) DEFAULT NULL,   `c2` varchar(10) DEFAULT NULL,   `c3` varchar(10) DEFAULT NULL,   `c4` varchar(10) DEFAULT NULL,   `c5` varchar(10) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `idx_test_c1234` (`c1`,`c2`,`c3`,`c4`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
星哥玩云
2022/08/18
2950
MySQL索引优化深入
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作;
加多
2018/09/06
2.5K0
Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践
死锁案例之九
死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想了解死锁的朋友有所帮助。
用户1278550
2018/08/09
8140
5.深入TiDB:Insert 语句
这篇文章我们看一下 TiDB 是插入数据是如何封装的,索引是如何维护的,如果插入的数据发生了冲突会如何处理,类似INSERT IGNORE 与 INSERT ON DUPLICATE KEY UPDATE插入语句是如何处理。
luozhiyun
2021/10/09
9950
5.深入TiDB:Insert 语句
玩转Mysql系列 - 第5天:DML操作汇总,确定你都会?
DML(Data Manipulation Language)数据操作语言,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除,是必须要掌握的指令,DML和SQL中的select熟称CRUD(增删改查)。
路人甲Java
2019/09/16
5140
大数据技术之_29_MySQL 高級面试重点串讲_02
  MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。
黑泽君
2019/06/16
6660
相关推荐
运维常用 mysql 语句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验