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

insert...on duplicate key update语法

基于这个问题,同事提出了insert...on duplicate key update这个办法,而我的第一反应是replace方法,因为我之前从来没用过insert...on duplicate key...: 1、首先创建一个包含id,name,age的表,其中id是主键; 2、在这个表中插入一条id=1的记录; 3、使用insert...on duplicate key update语法插入一条id=...duplicate key update语法的作用,可以分析到,当发生主键冲突的时候,可以直接进行update操作,这个update操作里面可以更新任意想要更新的列;而没有主键冲突的时候,相当于对这个表进行了一次插入操作...在对该现有的行加上S(共享锁)锁,然后返回这行数据给mysql,mysql执行duplicate后的update操作,先对该记录加上X(排他锁),接下来需要执行update操作。...,所以二者的差别主要有以下两处: 1、当表中存在自增值的时候,如果表中存在某条记录,replace语法会导致自增值+1,而insert...on duplicate key update语法不会; 2、

2.9K40

Mysql中的INSERT ... ON DUPLICATE KEY UPDATE

一、前言 在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行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);

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

    MySQL的ON DUPLICATE KEY UPDATE用法 增量更新

    1、效率太差,每次执行都要执行2个sql 2、高并发的情况下数据会出问题,不能保证原子性 还好MySQL 为我们解决了这个问题:我们可以通过 ON DUPLICATE KEY UPDATE 达到以上目的...ON DUPLICATE KEY UPDATE 可以达到以下目的: 向数据库中插入一条记录: 若该数据的主键值/ UNIQUE KEY 已经在表中存在,则执行更新操作, 即UPDATE 后面的操作。...FOREIGN_KEY_CHECKS=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都是唯一索引,插入的数据在两条记录上产生了冲突,然而执行后只有第一条记录被修改

    7.5K30

    IGNORE,REPLACE,ON DUPLICATE KEY UPDATE在避免重复插入记录时存在的问题及最佳实践

    背景知识 为了更好地理解后续对INGORE、REPLACE和ON DUPLICATE KEY UPDATE实现机制的分析,我们需要先了解innodb_autoinc_lock_mode这参数。...在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...对于insert...on duplicate key update,在使用时我们需要充分评估并发可能带来的死锁问题:如果业务场景中不太可能出现并发对同一条数据的操作,则优先选择该方案;否则优先考虑以下两种方案

    3.4K23

    mysql实现不存在就插入,存在就更新,sql直接执行和mybatis实现的坑!

    into 表名(字段1,字段2,...) values(值1, 值2,...) on duplicate key update 字段1=值1, 字段2=值2......上面语法在mysql直接执行sql语句是没问题的,但是mybatis就有大坑。我个人完全不推荐这么用等号赋值,而是用values,在文章末尾会给出推荐写法。...","客户信息","笔记") ON DUPLICATE KEY UPDATE kyc_info= "客户信息", todo_info="笔记"; 当插入session_id这个唯一索引重复的记录的时候,...UPDATE 表名 SET kyc_info="客户信息", todo_info="笔记" WHERE session_id="huihua123"; 直接运行上面这个sql一点问题都没有,那简直看起来正确极了...= null"> #{todoInfo,jdbcType=VARCHAR}, ON DUPLICATE KEY UPDATE

    1.3K10

    Mysql on 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或者primary key最好保证一个,不然不能保证语句执行正确(有任意一个unique key重复就会走更新,当然如果更新的语句中在表中也有重复校验的字段...mysql,然后mysql执行完duplicate后的update操作,然后对该记录加上X(排他锁),最后进行update写入。

    4.3K30

    SqlAlchemy 2.0 中文文档(四十九)

    与Update对象不同,不需要特殊标志来指定意图,因为在此上下文中的参数形式是清楚的: >>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update...添加了针对 MySQL 特定语法的方法,例如 ON DUPLICATE KEY UPDATE。...,“ON DUPLICATE KEY UPDATE”短语将始终匹配任何主键或唯一键,并且始终在匹配时执行 UPDATE;它没有选项可以引发错误或跳过执行 UPDATE。...与Update对象不同,不需要指定特殊标志来指定意图,因为此上下文中的参数形式是清晰明了的: >>> on_duplicate_key_stmt = insert_stmt.on_duplicate_key_update...添加用于 MySQL 特定语法的方法,如 ON DUPLICATE KEY UPDATE。 Insert对象是使用sqlalchemy.dialects.mysql.insert()函数创建的。

    2K10

    【MySQL基础】表的功能实现:增删查改详细讲解

    ON DUPLICATE KEY UPDATE column = value [, column = value] ......Update 语法: UPDATE table_name SET column = expr [, column = expr ...] [WHERE ...] [ORDER BY ...]...对查询到的结果进行列值更新 案例: 将唐三藏的qq号改为12345 先查看一下原表中的数据: 进行更改: update students set qq='12345' where name='唐三藏';...select * from students where name='曹操'; Empty set (0.00 sec) 删除整张表的数据: DELETE FROM 表名; 删除整张表的操作需要十分谨慎...选项(补充:在DELETE删除表项的时候,如果一个字段被设为自增字段,即使它前面的选项已经全部被删除,但是它仍然不会从头开始,而是继续在原基础上增加;但是截断则不同,它把原数据删除了之后,自增字段也会从头开始进行增加

    20600

    TiDB 源码阅读系列文章(十六)INSERT 语句详解

    第三种,语法 INSERT INTO VALUES () ON DUPLICATE KEY UPDATE,是当冲突后,更新冲突行后插入数据。如果更新后的行跟表中另一行冲突,则返回错误。...由于 INSERT IGNORE ON DUPLICATE KEY UPDATE 是在 INSERT ON DUPLICATE KEY UPDATE 上做了些特殊处理,将不再单独详细介绍,而是放在同一小节中介绍...INSERT ON DUPLICATE KEY UPDATE 语句 INSERT ON DUPLICATE KEY UPDATE 是几种 INSERT 语句中最为复杂的。...这里的正确执行应该是,第一个 1 正常插入,第二个 1 插入的时候发现有冲突,更新第一个 1。此时,就需要做如下处理。...IGNORE 放弃插入,改成更新冲突的行,如果更新的值再次冲突 报错:INSERT ON DUPLICATE KEY UPDATE 不报错:INSERT IGNORE ON DUPLICATE KEY

    1.9K30

    学会Mysql第二天

    如果没有where条件,则默认删除表中的所有数据 数据的更新 update 表名 set 字段名=新值 [where条件] update teacher set age=30 where sex="男...all 保留所有的结果 distinct 去除全部重复的记录 union all 不去除重复的 字段列表 有时候需要从多张表获取数据,当遇到同名字段的时候,需要用到别名。...,可以使用limit限制更新的数量 update 表名 set 字段名=值 [where 条件] limit 数量 update my_simple set id='1' limit 4; --只更新前四条记录...主键冲突的解决方案 1.主键冲突更新 insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段=新值(更新的是主键之外的新值) insert...into my_student values ('stu001','小婷') on duplicate key update stu_name='小婷'; 2.主键冲突替换 当主键冲突之后,删除数据重新插入

    1.1K40

    ON DUPLICATE KEY UPDATE Statement

    ON DUPLICATE KEY UPDATE语句 就像mysql官方文档中提到的那样,我们如果将a列设为UNIQUE唯一索引或者主键时,并且当前表已经存在了a=1的数据,对于这种情况,下面两条sql的结果是相等的...t1 SET c=c+1 WHERE a=1; 对于InnoDB引擎的表,此处的新增可能会触发自增列,但修改操作不会触发 如果上方的唯一索引再加一个b列,则上方第一条sql和下方sql结果相等 UPDATE...t1 SET c=c+1 WHERE a=1 OR b=2 LIMIT 1; 注意如果此处a=1 or b=2匹配多行,则只会更新一行,所以我们需要避免在有多个唯一索引的表上使用本语法 我们在表内没有满足条件的数据时执行该...,也可以使用 LAST_INSERT_ID()函数获取自增后的值 我们还可以在ON DUPLICATE KEY UPDATE后方使用VALUES函数来获取上方INSERT语句中某列的值例如 INSERT...ON DUPLICATE KEY UPDATE c = m+n; 就先写这么多吧

    1K30
    领券