首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql技巧:如果记录存在则更新如果不存在则插入的三种处理方法

要求: 新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。...(根据表上的唯一键),如果存在,先delete,然后再insert。...这个方法有一个很大的问题,如果记录存在,每次执行完,主键自增id就变了(相当于重新insert了一条),对于有复杂关联的业务场景,如果主表的id变了,其它子表没做好同步,会死得很难看。...该方法,没有replace into的副作用,不会导致已存在记录的自增id变化。...但是有另外一个问题,如果这个表上有不止一个唯一约束,在特定版本的mysql中容易产生dead lock(死锁),见网友文章https://blog.csdn.net/pml18710973036/article

9.2K20

记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

,哪些是删除的,然后再做对应的数据操作   需求   我们有表如下:   当商品配送完后之后,需要记录它的最新配送价,若商品最新配送价已经存在则进行更新,不存在则执行插入   针对这个需求,我们有哪些实现方式...INTO   当数据库是 MySQL ,碰到 不存在则插入,存在则更新 的需求时,第一时间往往想到的是 REPLACE INTO   工作原理 replace into 跟 insert 功能类似...  不同点在于: replace into 首先尝试插入数据到表中,如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则直接插入新数据 replace 语句会返回一个数...) 已经存在,那么先删除此记录,然后插入 (1001,10001,20.5,1,1)   而 (1001,10002,5.45,1,1) 判定为不存在,那么直接插入   这就导致我们看到的输出结果是:...duplicate key error ,每次冲突之后 AUTO_INCREMENT += 1,直到增长为 max(id) + 1 之后才能恢复正常 INSERT UPDATE   针对 不存在则插入

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

    MySQL避免插入重复记录的方法

    mysql在存在主键冲突或者唯一键冲突的情况下,根据插入策略不同,一般有以下三种避免方法。...一、insert ignore insert ignore会忽略数据库中已经存在的数据(根据主键或者唯一索引判断),如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据....如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据,否则,直接插入新数据。...KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致重复的问题,则插入新行,跟普通的insert into一样。...使用insert into,你必须具有insert和update权限 如果有新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2;如果记录被更新前后值是一样的,则受影响行数的值显示

    2.3K51

    MySQL 批量插入记录报 Error 1390 (HY000)

    1.背景 Golang 后台服务使用 GORM 实现与 MySQL 的交互,在实现一个通过 Excel 导入数据的接口时,使用 Save 方法一次性插入大量记录(>1w)时报了如下错误: Error 1390...3.分批插入 既然不允许一次插入太多记录,那么可以改为分批插入,而不是一次性插入所有数据。 // 待插入的记录。...不知道你有没有疑问,我这里分批插入每批记录数是 1000,那可以采用 2000 或者其他数量吗?每批插入记录数的上限是多少呢? 带着这个疑问,请继续往下看。 4.一次最多能插入多少条记录?...MySQL 服务端之所以报 Error 1390 (HY000) 错误,直接原因是一次插入过多的记录,但更深层次的原因是 MySQL SQL 语句的占位符数量有上限,最大值为 16bits 无符号整数的最大值...如果每次都需要经过上面的词法语义解析、语句优化,则效率明显很低。 如果事先解析优化好 SQL 语句,一次编译,多次运行,这种 SQL 被称为预处理语句(Prepared Statement)。

    95110

    MySQL 核心模块揭秘 | 47 期 | 插入记录的 Undo 日志

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....Insert Undo 日志格式 插入一条记录到表中,首先会插入记录到主键索引,然后遍历二级索引,把记录插入到各个二级索引中。 插入记录到主键索引之前,会生成 Undo 日志,并写入 Undo 页。...插入记录到二级索引,不会生成 Undo 日志。插入记录的 Undo 日志格式比较简单,如下图所示。...table_id,64 位整数,压缩之后占用 1 ~ 11 字节,这个属性值是表 ID,表示事务插入记录到哪个表产生的这条 Undo 日志。...如果主键是由多个字段组成的联合主键,插入记录产生的 Undo 日志中,会按照联合主键定义的字段顺序写入所有主键字段的长度和值:len_1、value_1、len_2、value_2、...

    6710

    mysql中一条insert语句批量插入多条记录

    插入语句常用写法: INSERT INTO items(name,city,price,number,picture) VALUES('耐克运动鞋','广州',500,1000,'003.jpg');...这种方式只能够一次插入一条数据,要想插入多条数据,就得多次调用此sql语句,意味着多次与数据库建立连接。...幸好MySQL提供了另一种解决方案,就是使用一条INSERT语句来插入多条记录。这并不是标准的SQL语法,因此只能在MySQL中使用。...])); 可以看到,和原来的常规INSERT语句的区别,仅仅是在VALUES 后面增加值的排列,每条记录之间用英文输入法状态下的逗号隔开,是不是so easy。...建议: 在程序中,插入批量数据时,最好使用这种通过一条INSERT语句来一次性插入的方式。这样可以避免程序和数据库建立多次连接,从而增加服务器负荷。

    5.5K20

    MySQL 核心模块揭秘 | 32 期 | 插入记录,主键索引冲突加什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....原理分析 insert 语句执行过程中,插入记录到主键索引之前,需要先找插入记录的目标位置。 目标位置为表中主键字段值小于等于新插入记录中主键字段值的最后一条记录之后。...InnoDB 还需要对表中 的记录验明正身,确定它是一条有效的记录。 如果表中 的记录已经被其它已提交事务标记删除,只是还没有被清理,它就不是有效的记录了。...这种情况下,新记录可以正常插入,不会报错。 否则,新记录和表中已有记录冲突,不能插入,就可以报错了。...如果表中 的记录已经被标记删除,但是删除这条记录的事务还没有提交怎么办? 那我们看到的加锁情况就不一样了。

    9710

    MySQL 核心模块揭秘 | 33 期 | RR 隔离级别插入记录,唯一索引冲突加什么锁?

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....示例 SQL 中,我们插入了一条 的记录,没有指定 id 字段值。 id 是自增字段,插入记录时,我们没有指定 id 字段值,MySQL 会自动为我们生成。...也就是说,插入到用户普通表中唯一索引的多条记录,如果唯一索引的任何一个字段值为 NULL,这些记录都可以插入。 现在,我们继续回到例行检查工作中。...如果新插入记录中,唯一索引的任何一个字段值为 NULL,InnoDB 就认为新插入记录和表中已有记录不冲突,检查工作到此结束。...如果已发现的冲突记录被标记删除了,只是还没有被清理,说明它不有效记录,新记录可以插入。 如果已发现的冲突记录是有效记录,新记录就不能插入了,要报错。

    11210

    MySQL 核心模块揭秘 | 34 期 | RC 隔离级别插入记录,唯一索引冲突加什么锁?

    作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。...本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....MySQL 会自动生成 id 字段值,根据表中数据可以推导出,新插入记录的 id 字段值为 7。...如果要插入的记录中存在值为 NULL 的字段,虽然从存储内容上来说,发现了同样的记录,但是也会被认为是不同的记录。这种情况下,新记录可以继续插入到唯一索引中。...如果表中 的记录已经被标记删除,新记录就可以继续插入到唯一索引 uniq_i1 中,否则,新记录不能插入,需要报错。

    12410

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

    一、前言 在日常业务开发中经常有这样一个场景,首先创建一条记录,然后插入到数据库;如果数据库已经存在同一主键的记录,则执行update操作,如果不存在,则执行insert操作; 这个操作可以在业务层做,...也可以在数据库层面做; 业务层一般做法是先查询,如果不存在在插入,如果存在则更新,但是查询和插入不是原子性操作,在并发量比较高的时候,可能两个线程都查询某个记录不存在,所以会执行两次插入,然后其中一条必然会因为主键...c=c+1; 如上sql假如t1表的主键或者UNIQUE 索引是a,那么当执行上面sql时候,如果数据库里面已经存在a=1的记录则更新这条记录的c字段的值为原来值+1,然后返回值为2。...如果不存在则插入a=1,b=2,c=3到数据库,然后返回值为1。...image.png 四、参考 https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    2.4K30

    Mysql 4 种方式避免重复插入数据!

    ,如果数据存在,则忽略此次插入,前提条件是插入的数据字段设置了主键或唯一索引,测试SQL语句如下,当插入本条数据时,MySQL数据库会首先检索已有数据(也就是idx_username索引),如果存在,则忽略本次插入...,如果不存在,则正常插入数据: 2、on duplicate key update 即插入数据时,如果数据存在,则执行更新操作,前提条件同上,也是插入的数据字段设置了主键或唯一索引,测试SQL语句如下...,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username索引),如果存在,则执行update更新操作,如果不存在,则直接插入: 3、replace into 即插入数据时,如果数据存在...,则删除再插入,前提条件同上,插入的数据字段需要设置主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username索引),如果存在,则先删除旧数据,然后再插入...,这种方式适合于插入的数据字段没有设置主键或唯一索引,当插入一条数据时,首先判断MySQL数据库中是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略: 目前,就分享这4种MySQL处理重复数据的方式吧

    2.1K20

    【MySQL】面试官问我:MySQL如何实现无数据插入,有数据更新?我是这样回答的!

    先来个简单题目 正式回答这个面试题时,我们先来看一个简单点的题目:如何实现向MySQL中插入数据时,存在则忽略,不存在就插入?...其实,这个简单点的题目与标题的题目有相同的地方:都是MySQL中不存在待插入的数据时,就将待插入的数据插入到MySQL中。...分析标题题目 接下来,我们再来看标题中的题目,向MySQL中插入数据,存在就更新,不存在则插入。本质上数据表中还是需要存在唯一键,也就是唯一索引的。往往在面试中,面试官都会默许存在这些前置条件。...c=c+1; UPDATE table SET c=c+1 WHERE a=1; 如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。...在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明在表中并没有重复的记录,如果返回2,说明有一条重复记录,系统自动先调用了DELETE删除这条记录,然后再记录用INSERT来插入这条记录。

    75510

    Mysql 4种方式避免重复插入数据!

    ,测试SQL语句如下,当插入本条数据时,MySQL数据库会首先检索已有数据(也就是idx_username索引),如果存在,则忽略本次插入,如果不存在,则正常插入数据: ?...02 on duplicate key update 即插入数据时,如果数据存在,则执行更新操作,前提条件同上,也是插入的数据字段设置了主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据...03 replace into 即插入数据时,如果数据存在,则删除再插入,前提条件同上,插入的数据字段需要设置主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username...索引),如果存在,则先删除旧数据,然后再插入,如果不存在,则直接插入: ?...,这种方式适合于插入的数据字段没有设置主键或唯一索引,当插入一条数据时,首先判断MySQL数据库中是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略: ?

    12.5K30
    领券