首页
学习
活动
专区
圈层
工具
发布

Mysql中的INSERT ... ON DUPLICATE KEY UPDATE

一、前言 在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作; 这个操作可以在业务层做,...(这里说的主键不是递增主键)冲突而失败。...数据库层mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做这个事情,并且是原子性操作 二、INSERT ......c=c+1; 如上sql假如t1表的主键或者UNIQUE 索引是a,那么当执行上面sql时候,如果数据库里面已经存在a=1的记录则更新这条记录的c字段的值为原来值+1,然后返回值为2。...2.2多记录下使用 INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

2.2K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL中insert阻塞问题的分析

    这是一套MySQL 5.7.16的环境,事务隔离级别为RR 等我连接到这套环境的时候,show processlist的输出已经恢复了正常,查看相关的数据库日志也没有任何额外的输出,查看慢日志发现了有一部分的慢日志...,提示是在insert into的语句,看起来着实蹊跷,计。...同时整个操作中涉及的表也很明显,是device_confignew_clientup,和慢日志里面显示的表和信息是可以互相呼应的。...顺着这个思路,我继续进行排查,发现问题是越来越清晰了,我基于一个字段开始梳理,发现这个编码的数据相关的Insert有5000多条,也就意味着这个业务里面存在着大量冗余的数据写入。...业务服务器会不断发起短连接请求,整个过程中是无状态的,发起的数据写入很可能是冗余的,为了在数据库中达到唯一性,设置了这个唯一性索引,而业务的持续不断的写入,因为唯一性索引会额外有检测数据库冲突的逻辑,所以相关的

    2K30

    MySQL 中的 INSERT 是怎么加锁的?

    来源:https://www.aneasystone.com/archives/2018/06/insert-locks-via-mysql-source-code.html 在之前的博客中,我写了一系列的文章...很显然,如果我们能在 insert 语句加插入意向锁之后写数据之前下个断点,再在另一个会话中执行 select 就可以模拟出这种场景了。 那么我们来找下 insert 语句是在哪加插入意向锁的。...第一次看 MySQL 源码可能会有些不知所措,调着调着就会迷失在深深的调用层级中,我们看 insert 语句的调用堆栈,一开始时还比较容易理解,从 mysql_parse -> mysql_execute_command...到这里我突然想起之前做过的 insert 加锁的实验,执行 insert 之后,如果没有任何冲突,在 show engine innodb status 命令中是看不到任何锁的,这是因为 insert...这个锁的释放非常快,但是这个锁足以保证在插入数据的过程中其他事务无法访问记录所在的页。

    12.3K52

    Mysql中INSERT ... ON DUPLICATE KEY UPDATE的实践

    一、前言 在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作; 这个操作可以在业务层做,...数据库层mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做这个事情,并且是原子性操作,本文就来讲解的使用。 二、INSERT ......下使用 Mybatis作为经典的数据库持久层框架,自然要介绍下它下的使用 在mapper.xml里面配置如下: 假设a为主键 insert id="insertOrUpdate">...int c; ... } 注:mysql中sql字符串大小有限制,我本机的mysql上执行show VARIABLES like '%max_allowed_packet%';结果为max_allowed_packet...image.png 四、参考 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    2.8K30

    Mysql中REPLACE INTO详解及和INSERT INTO的区别

    REPLACE INTO 原理 REPLACE INTO和 INSERT INTO功能类似,不同点在于: 若表中的一条旧记录与一条使用PRIMARY KEY主键索引或使用UNIQUE 唯一索引的新记录具有相同的值...返回的影响行数 无主键无唯一索引 INSERT INSERT INSERT 行数 ⭐只有主键 场景 REPLACE INTO 是相当于 REPLACE INTO 在 binlog 中的表现形式 返回的影响行数...REPLACE INTO 在 binlog 中的表现形式 返回的影响行数 唯一索引冲突 DELETE+INSERT UPDTATE DELETE+INSERT 行数 ⭐有主键有唯一索引 场景 REPLACE...INTO 是相当于 REPLACE INTO 在 binlog 中的表现形式 返回的影响行数 主键冲突唯一索引不冲突 DELETE+INSERT DELETE+INSERT DELETE+INSERT...第一种形式与INSERT INTO的用法类似。 第二种形式相似于 INSERT SELECT。这种用法并不强制要求列名匹配,事实上,MYSQL 甚至不关心SELECT返回的列名,它需要的是列的位置。

    52510

    MySQL中的INSERT INTO SELECT语法及其用法详解

    当今的数据库管理系统在数据存储和检索方面起着关键作用,而MySQL作为最受欢迎的开源关系型数据库管理系统之一,提供了许多强大的功能。...在MySQL中,INSERT INTO SELECT语法是一种非常有用的功能,可以将查询结果直接插入到目标表中。本文将介绍MySQL中的INSERT INTO SELECT语法及其用法。...什么是INSERT INTO SELECT语法? INSERT INTO SELECT语法允许我们从一个表中选择数据,并将其插入到另一个表中。...这个功能非常适用于需要从一个表中复制数据到另一个表的情况,或者将查询结果存储到新的表中。...INSERT INTO SELECT语法的基本语法格式 下面是INSERT INTO SELECT语法的基本语法格式: INSERT INTO 目标表 (列1, 列2, 列3, ...)

    11K30

    mysql insert into as_mysql insert into select使用方法详解

    mysql insert into select使用方法详解2017-11-22 15:47 我们先来看看mysql insert into select的语法规则。...DELAYED被忽略INSERT … SELECT。 该INSERT语句的目标表可能出现在查询部分的FROM子句中SELECT。但是,不能插入到表中并从子查询中的同一个表中进行选择。...在从同一个表中选择并插入时,MySQL创建一个内部临时表来存放来自这些表的行SELECT,然后将这些行插入到目标表中。...为避免SELECT在INSERT引用同一个表时引用不明确的列引用问题 , 请为该SELECT部分中使用的每个表提供唯一的别名,并使用适当的别名限定该部分中的列名。...由于这个问题,在MySQL 5.5.18中, INSERT…SELECT ON DUPLICATE KEY UPDATE和INSERT IGNORE… SELECT语句被标记为不安全的基于语句的复制。

    3K30

    MySQL优化INSERT的性能

    这种费时的操作其实是很有风险的,假设程序出了问题,想重跑操作那是一件痛苦的事情。因此,提高大数据量系统的MySQL insert效率是很有必要的。 1. 一条SQL语句插入多条数据。...COMMIT; 使用事务可以提高数据的插入效率,这是因为进行一个INSERT操作时,MySQL内部会建立一个事务,在事务内进行真正插入处理。...从测试结果可以看到,insert的效率大概有50倍的提高,这个一个很客观的数字。 注意事项: 1....SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M。 2....事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会日志会使用磁盘数据,这时,效率会有所下降。

    2.2K40

    MySQL中插入语句(Insert)的几种使用方式

    注意:insert这种简写的方式虽然非常简单,但是Values后面的值必须和表中的类顺序对应,且类型要保持一直,即使表中某一个列不需要值也必须赋值为null,比如我们的主键id设置的是递增实际上是不用设置值的...推荐使用的原因**:这一次我们设置了没有给id赋任何值包括null,而且不用关心表中字段的顺序,比如下面不按照正常顺序添加,我们将age放在第一,name放在第二个.也能添加成功;需要注意的是表名后面的字段名必须和后面...values赋的值保持一致;实际开发中在维护和扩张方面都比方案一要好. ?...6.INSERT SELECT语句 1.此语句的作用是将SELECT语句的结果插入表中,可实现数据迁移。...查看被插入的表的所有数据 ? 执行INSERT SELECT语句并查看结果 ?

    3.2K30

    关于MySQL中insert ignore,insert on duplicate和replace into,你可能没想过区别

    读完需要10分钟 速读仅需5分钟 在数据流转中或者日常的数据操作中,势必会有数据写入的过程,如果把一些数据写入一张数据库表中,如果写入量有100万,而重复的数据有90万,那么如何让这10%的数据能够更高更高效的写入...在MySQL方向提供了Insert ignore into,insert into on duplicate,replace into这几种写入的方式,看起来好像都差不多,但是实际上在一些场景下的差异还比较大...相比而言,replace into和insert into on duplicate存在本质的区别,replace into是覆盖写,即删除原来的,写入新的。...insert ignore into 在这种场景下最为通用,而且对于数据的侵入性最小。...否则采用insert into on duplcate或者insert ignore into 2 基于id,xid,name的数据列,其中id为主键,自增,xid为唯一性索引 为了三种测试场景的基准对等

    4.9K31

    MySQL insert or update sql

    MySQL 一条 sql 实现数据保存变更 insert or update ,如果没有执行insert,有就update 需要 有主键 PRIMARY 或 唯一索引 UNIQUE MySQL...中的INSERT … ON DUPLICATE KEY UPDATE语句,该语句是基于唯一索引或主键使用 ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。...使用ON DUPLICATE KEY UPDATE,最终如果插入了一个新行,则受影响的行数是1,如果修改了已存在的一行数据,则受影响的行数是2,如果值不变,则受影响行数是0。...=语句格式写入二进制日志的不安全语句。...插入……对于具有多个唯一密钥的表的重复密钥更新是不安全的 相关博客:https://blog.csdn.net/rick_zyl/article/details/79024612 mysql 有就更新

    3.7K20

    mysql update,insert常用

    ,将表中数据插入到另一个表中 insert ignore忽略重复数据插入报错问题 ---- update更新,batch批量更新 ---- set sql_safe_updates=0; # 常规update...update springdemo.users set pwd=nickname where id=id; 下面给一个stack overflow中,按照条件批量更新的示例: 将id=1的字段赋值为...insert 数据到表中,将表中数据插入到另一个表中 ---- 基本插入示例: INSERT INTO tb_name(col1, col2) VALUES ("hyq","M"); # 例如 insert...into teacher(name, age) values('jack ma', 32); 工作中,往往我们要把一个表中的数据插入到另一张表中: INSERT INTO tb_al_sample...---- 当表中存在唯一索引时,如果插入相同的值,mysql会报错,所以我们一般使用: insert ignore into tb_name (title, introduction) VALUES

    4.2K30

    MySQL INSERT的4种形态

    INSERT语句是最常见的SQL语句之一,MySQL中INSERT有其他形态的插入数据方式。...所以这样的写法对数据的安全性是没有保障的。 延迟插入和替换在MySQL 5.6中是不推荐的。在MySQL 5.7,MySQL 8.0中,不支持延迟。...IGNORE: insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据,主键和唯一键为基准; mysql> insert ignore tinsert(id,name) values...注意:当从同一个表中选择和插入时,MySQL创建一个内部临时表来保存SELECT中的行,然后将这些行插入到目标表中。...在实际sysbench压测中,硬件配置比较好的情况,混合&插入模式下 MySQL的单台TPS能到 1w~6w的性能。insert也是有极限的,超过这个范围的时候,会存在延迟等性能瓶颈。 2.

    1.9K20
    领券