DUPLICATE KEY UPDATE batch执行时出死锁错误 背景知识 一、 mysql insert 与 duplicate key: 典型的插入语句: 多条:INSERT INTO tablename...(id, data) VALUES (1, 10) ON DUPLICATE KEY UPDATE data=data+10; UPDATE tablename SET data=data+10 WHERE...KEY UPDATE data=data+VALUE(data) 二、innodb表提高插入效率 查询表使用的引擎: show create table tablename; innodb 的存储引擎提供行级锁...在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。 c....; 在项目中遇到的问题时,使用了这种insert处理,但是分库分表,数据表类型为innodb, tablename各不相同,duplicate key只是用于合并update和insert语句。
查询:INSERT INTO member_test(mem_no,flag)VALUE('111','1') 错误代码: 1062 Duplicate entry '111' for key '...=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='会员测试信息'; 2.在遇到主键冲突的时候,跳过不报错。...2 INSERT INTO member_test(mem_no,flag)VALUE('111','1') ON DUPLICATE KEY UPDATE flag = flag - 1; ##无主键冲突新增...影响行数1 INSERT INTO member_test(mem_no,flag)VALUE('222','1') ON DUPLICATE KEY UPDATE flag = flag; ##...有主键冲突无修改 影响行数0 INSERT INTO member_test(mem_no,flag)VALUE('222','1') ON DUPLICATE KEY UPDATE flag = flag
ON DUPLICATE KEY UPDATE是MySQL insert的一种扩展。...当发现有重复的唯一索引(unique key)或者主键(primary key)的时候,会进行更新操作;如果没有,那么执行插入操作。 这样使用的好处是能够节省一次查询判断。...ON DUPLICATE KEY UPDATE强烈不推荐对拥有多个唯一索引(unique key)的表使用,除非你非常清醒地知道你在干什么会有什么样的后果。...接下来我们试一下没有数据变更的: insert into test(playerId, name) values(102, 'James') ON DUPLICATE KEY UPDATE playerId...引用资料 https://mariadb.com/kb/en/library/insert-on-duplicate-key-update/ https://dev.mysql.com/doc/refman
一、前言 在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作; 这个操作可以在业务层做,...数据库层mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做这个事情,并且是原子性操作 二、INSERT ......ON DUPLICATE KEY UPDATE命令 2.1单条记录下使用 INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE...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);
[ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ] 2....在UPDATE字句中可以使用VALUES(col_name)函数来引用INSERT字句中的VALUES值; 比如: INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6...) ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性 还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE 达到以上目的...ON DUPLICATE KEY UPDATE 可以达到以下目的: 向数据库中插入一条记录: 若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。...=1; Step2 .测试 ON DUPLICATE KEY UPDATE 的使用方法: INSERT INTO mRowUpdate(id,`value`) VALUES(3, ‘SuperMan’)...ON DUPLICATE KEY UPDATE `value`=’SuperMan’; ?...) on duplicate key update tid = tid + 1; 因为a和b都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改
数据库层mysql中INSERT ... ON DUPLICATE KEY UPDATE就可以做这个事情,并且是原子性操作,本文就来讲解的使用。 二、INSERT ......ON DUPLICATE KEY UPDATE命令 2.1单条记录下使用 INSERT INTO t1 (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE...2.2多记录下使用 INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c); 三、MyBatis...KEY UPDATE c=values(c),b=values(b) 对应的mapper接口可以定义为: long insertOrUpdate(List list)...image.png 四、参考 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html
执行sql insert into admin(business_id) values (12345) on duplicate key update is_update = 1; 3....发现问题 表中business_id有12345的重复数据,执行之后发现执行成功,但是该数据的is_update并没有改变。 4....字段重复造成的,所以就没有is_update字段的更改。...由此分析出 unique key的异常级别高于duplicate key的重复判断。执行过程是先确保insert语句可执行,之后再判断duplicate key。...解决办法 在执行insert duplicate key语句的时候,尽量使用主键作为判断,主键的重复判断优先级比其他字段的unique key优先级高,所以在执行插入重复的时候能正常触发update。
大家好,又见面了,我是你们的朋友全栈君。...); if($row){ mysql_query('update ...'); }else{ mysql_query('insert ...'); } 但是这样写有两个问题?...1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性 ON DUPLICATE KEY UPDATE 可以达到以下目的: 向数据库中插入一条记录:若该数据的主键值/...UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。...KEY UPDATE %s", $table, $field, $value, $bindField); return $sql; } 发布者:全栈程序员栈长,转载请注明出处:
背景 数据入库这块有离线和实时两套入库系统,写同一个db的同一批mysql表,两边用的都是insert into table on duplicate key update这种方式。...原因分析&解决方案 这里面分两种情况,一种是带主键的insert duplicate key update,一种是没有主键带唯一索引的insert duplicate key update。...1、带主键的insert duplicate key update 实时入库的batch大小是1w,离线入库的batch大小也是1w,为了提高入库效率 ,两边都开启了事务。...2、带唯一索引的insert duplicate key update https://developer.aliyun.com/article/727076 这篇文章讲的很清楚,这里我大致聊一下。...如果插入数据时带上主键,那么就不会产生next-key锁,会退化到第一种情况(带主键的insert duplicate key update)。
KEY UPDATE一步就可以完成(Mysql独有的语法)。...ON DUPLICATE KEY UPDATE单个增加更新及批量增加更新的sql 在MySQL数据库中,如果在insert语句后面带上ON DUPLICATE KEY UPDATE 子句,而要插入的行与表中现有记录的惟一索引或主键中产生重复值...(1,2,3) ON DUPLICATE KEY UPDATE c=c+1; UPDATE table SET c=c+1 WHERE a=1; ON DUPLICATE KEY UPDATE...,那么也不会更新成功而导致报错,只有当该条语句没有任何一个unique key重复才会插入新记录);尽量不对存在多个唯一键的table使用该语句,避免可能导致数据错乱。...mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。
AS alias) and replace VALUES(col) in the ON DUPLICATE KEY UPDATE clause with alias.col instead MySQL...8 版本之后,VALUES(col)函数被废弃,请使用别名替换: 新语法 自增主键的变化 If a table contains an AUTO_INCREMENT column and INSERT...ON DUPLICATE KEY UPDATE inserts or updates a row, the LAST_INSERT_ID() function returns the AUTO_INCREMENT...自动更新时间的变化《数据无更新不会更新时间》 An auto-updated column remains unchanged if all other columns are set to their...id=6312 https://dev.mysql.com/doc/refman/8.4/en/insert-on-duplicate.html
当MySQL表字段设置unique key或者primary key时,被约束的字段就必须是唯一的。新插入数据直接使用insert into,如果出现唯一性冲突,就会抛出异常。...= 1; 常用插入语句 insert into 当插入数据时,如果唯一性校验出现重复问题,则报错; 如果没有重复性问题,则执行插入操作。...key update 当插入数据时,如果唯一性校验出现重复问题,则在原有记录基础上,更新指定字段内容,其它字段内容保留; 如果没有重复性问题,则执行插入操作。..., email ) VALUES ( 'Buffett', '123456', '13800000088', 'aaaa@163.com' ) ON DUPLICATE KEY UPDATE...如果没有重复性问题,则执行插入操作,效果和insert into是一样的。
ON " + "DUPLICATE KEY UPDATE extraInfo = ?, appProductId = ?...之前没有遇到过insert出死锁的情况,所以当时觉得是on dpulicate key update导致的。...…ON DUPLICATE KEY UPDATE的时候,如果我们有多个唯一索引,那么有可能会导致binlog错误,也就是会导致主从复制不一致,具体的一些测试可以去链接中查看 3.如何解决 如果遇到这个问题怎么办呢...duplicate key update,使用普通的insert。...我们最后使用的就是这个方法,因为ON DUPLICATE KEY UPDATE 这个在代码中的确是没有必要 在数据库表中只建立主键,不建立其他唯一索引。
("id","name") 就是根据这个里面设置的字段进行判断 数据是不是一样 2 MySQL数据库 ON DUPLICATE KEY UPDATE 案例 INSERT INTO...那么这条语句是如何解释呢,我们很容易理解前面的部分, 就是一个简单的插入语句,让我们看下后面的部分 ON DUPLICATE KEY UPDATE `email`=VALUES(`email`),`address...`= VALUES(`address`), `update_time`=VALUES(`update_time`)我们看到后面是 一个更新的操作,后面指定了更新的字段, 也就是说判断出表中没有这条数据,...先声明一点:ON DUPLICATE KEY UPDATE 这个子句是MySQL特有的,语句的作用是,当insert已经存在的记录时,就执行update。...以上介绍的是addOrUpdate的语义,其实修改的方法有很多种, 包括SET或用REPLACE,连事务都省的做, ON DUPLICATE KEY UPDATE能够让我们便捷的完成重复插入 的开发需求
三、使用INSERT...ON DUPLICATE KEY UPDATE 3.1 使用示例 类似地,为了验证唯一键冲突,我们选择插入和数据表中已有记录完全相同的身份证号: insert into `identity_info...在MySQL的官方文档中有这样一段话: With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is...失败 执行insert...on duplicate key update 3 获取重复记录的S锁,并获取该记录 insert失败 4 update该记录的值 获取重复记录的S锁,并获取该记录 5 申请该记录的...什么意思呢,假设我们一张表有两个唯一键(包括主键)A和B,现在我们使用insert...on duplicate key update语句插入一条记录,而我们插入的这条记录同时和数据表中的两条记录record1...ON DUPLICATE KEY UPDATE产生death lock死锁原理 4、https://www.jb51.net/article/169601.htm MySQL使用Replace操作时造成数据丢失的问题解决
VALUES(1,1),(2,2),(3,3); 使用IGNORE,如果插入的记录中存在重复值会忽略重复值的该记录行,不影响其他行的插入。...2.REPLACE REPLACE INTO Table_name() VALUES(1,1),(2,2),(3,3) 使用replace当插入的记录遇到主键或者唯一重复时先删除表中重复的记录行再插入...*ON DUPLICATE KEY UPDATE *NAME1=VALUES(ID)+1 INSERT TO Table_name() VALUES(1,1),(1,2) ON DUPLICATE KEY...UPDATE NAME1=NAME1+1; ON DUPLICATE KEY UPDATE后面使用VALUES指的是插入记录的值,而不使用VALUES指的是表的自身值。...其后执行的UPDATE更新的记录是WHERE重复的主键或唯一键的ID。
ON DUPLICATE KEY UPDATE语句 就像mysql官方文档中提到的那样,我们如果将a列设为UNIQUE唯一索引或者主键时,并且当前表已经存在了a=1的数据,对于这种情况,下面两条sql的结果是相等的...t1 SET c=c+1 WHERE a=1; 对于InnoDB引擎的表,此处的新增可能会触发自增列,但修改操作不会触发 如果上方的唯一索引再加一个b列,则上方第一条sql和下方sql结果相等 UPDATE...(1,2,3) ON DUPLICATE KEY UPDATE c=c,b=b; 如果使用 mysql_real_connect()来连接mysql,修改的值没有变化时,还是返回1 并且如果我们触发了自增...,也可以使用 LAST_INSERT_ID()函数获取自增后的值 我们还可以在ON DUPLICATE KEY UPDATE后方使用VALUES函数来获取上方INSERT语句中某列的值例如 INSERT...VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=9; 从 MySQL 8.0.20开始,不推荐使用 VALUES ()来引用新的行和列,并且在将来的 MySQL
insertOrUpdate 在我们日常使用中比较常见,那么它是如何实现的呢,不知道大家有没有考虑过呢? 在 MySQL 中,可采用INSERT INTO ......ON DUPLICATE KEY UPDATE 语句,需满足以下条件: 表必须具有主键或唯一索引; 插入的数据必须包含主键或唯一索引列; 主键或唯一索引列的值不能为 NULL。...ON DUPLICATE KEY UPDATE语句时,数据库首先尝试插入新行。在此过程中,数据库会检查表中是否存在与新插入行具有相同的唯一索引或主键的记录。...执行更新:在检测到唯一索引或主键的冲突后,数据库将根据ON DUPLICATE KEY UPDATE后面指定的列和值来更新已存在的记录。...浅谈主键跳跃 在 MySQL 中使用 INSERT ON DUPLICATE KEY UPDATE 语句时,如果插入操作失败(因为主键或唯一键冲突),而执行了更新操作,确实会导致自增主键计数器增加,即使没有实际插入新记录
具体的区别: (1) 唯一性约束所在的列允许空值,但是主键约束所在的列不允许空值。...(2) 可以把唯一性约束放在一个或者多个列上,这些列或列的组合必须有唯一的。但是,唯一性约束所在的列并不是表的主键列。 (3) 唯一性约束强制在指定的列上创建一个唯一性索引。...,但是id也变成最新的了,所以不是更新,是删除再新增 insert on duplicate key update 如果在insert into 语句末尾指定了on duplicate key update...mysql执行完duplicate后的update操作, 然后对该记录加上X(排他锁),最后进行update写入。...参考 Mysql中unique与primary约束的区别分析(转) MySQL避免插入重复记录:唯一性约束 MySQL优化–INSERT ON DUPLICATE UPDATE死锁 ---- 我是蜗牛
领取专属 10元无门槛券
手把手带您无忧上云