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

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

要求: 新增一个员工时,如果该员工已存在(以员工号f_emp_code作为判断依据),则更新,否则插入。而且工资f_salary,更新时,不得低于原工资(即:工资只能涨,不能降)。...f_salary ) VALUES( '10007' , '新人' , '西安' , IF(1000 > f_salary , 1000 , f_salary)); replace into相当于,先检测该记录是否存在...(根据表上的唯一键),如果存在,先delete,然后再insert。...这个方法有一个很大的问题,如果记录存在,每次执行完,主键自增id就变了(相当于重新insert了一条),对于有复杂关联的业务场景,如果主表的id变了,其它子表没做好同步,会死得很难看。...该方法,没有replace into的副作用,不会导致已存在记录的自增id变化。

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

    Laravel代码简洁之道和性能优化

    IGNORE 的支持 先简单说明一下业务场景: 首先表结构设计是:互相喜欢和添加联系人都是双向关系,即入库A B,B A这样成对的双向数据 触发互相喜欢,插入2条双向数据,插入之前校验是否存在,存在不重复添加...如果互相喜欢,则添加双向联系人关系,插入之前校验是否存在,存在则更新type等字段,不存在则插入双向数据 我们通过这个场景能非常好的体会laravel-upsert的强大,不仅减少了代码量,也减少了sql...,优化后22行代码,代码行数少了3倍+ 查询sql的条数:优化前5条sql,优化后2条sql laravel-upsert 扩展的特性 安装 composer require staudenmeir/laravel-upsert...这可以是单个记录或多个记录。 第二个参数是唯一标识记录的列。除 SQL Server 外的所有数据库都要求这些列具有PRIMARY或UNIQUE索引。 提供要更新的列作为第三个参数(可选)。...您还可以在忽略重复键错误的同时插入记录: Schema :: create ( 'users' , function ( Blueprint $ table ) { $ table ->

    5.8K20

    MySQL InnoDB 加锁机制

    ,则以下语句仅使用值为100的行的索引记录锁, 其他会话是否在前面的间隙中插入行无关紧要: SELECT * FROM test WHERE no = 100 FOR UPDATE; 如果no是非唯一索引...允许冲突间隙锁的原因是,如果从索引中清除记录,则必须合并不同事务在记录上持有的间隙锁。 InnoDB间隙锁定是"纯粹的抑制性",这意味着它们的唯一目的是防止其他事务插入到间隙中....有Shard或Exclusive两种模式 插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,亦即多个事务在相同的索引间隙插入时如果不是插入间隙中相同的位置就不需要互相等待...也就是, 当等值查询时, InnoDB会对值前后的间隙加锁, 如果存在记录, 则加上记录锁 4.使用普通非聚簇索引的范围查询 a) 左右都是开区间, 且左右范围不存在记录 start transaction...; 当值不存在, 需要锁住该记录前后的空隙才能保证不出现幻行 6.使用非聚簇唯一索引的范围查询 a) 左右都是开区间, 且左右范围不存在记录 start transaction; select * from

    3K00

    MySQL中的锁机制详细说明

    根据索引对单行数据进行更新的加锁原理了解了,那如果更新操作涉及多个行呢,比如下面 SQL 的执行场景。...一条记录操作完成,再读取下一条记录,直至没有匹配的记录为止。 2. 表锁 上面我们讲解行锁的时候,操作语句中的条件判断列都是有建立索引的,那么如果现在的判断列不存在索引呢?...MyISAM存储引擎支持并发插入,以减少给定表的读操作和写操作之间的争用: 如果MyISAM表在数据文件中没有空闲块(由于删除或更新导致的空行),则行始终插入数据文件的末尾。...此时其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。...当我们使用范围条件而不是相等条件去检索,并请求锁时,InnoDB就会给符合条件的记录的索引项加上锁;而对于键值在条件范围内但并不存在(参考上面所说的空闲块)的记录,就叫做间隙,InnoDB在此时也会对间隙加锁

    1.6K10

    MySQL并发控制:锁机制

    其他 session 仍然可以查询记录,并也可以对该记录加 share mode 的共享锁。但是如果当前事务需要对该记录进行更新操作,则很有可能造成死锁。...其他 session 可以查询该记录,但是不能对该记录加共享锁或排他锁,而是等待获得锁。 UPDATE语句: 1、如果使用唯一索引,InnoDB仅锁定索引记录本身,不锁定间隙。...WHERE id=n 更新不存在的记录时,会造成间隙锁。 3、UPDATE ... WHERE ...在搜索遇到的每条记录上设置一个独占的next-key锁,如果是唯一索引只锁定记录。...当一个程序发现记录不存在,就试图插入一条新数据,如果两个线程都这么做,就会出现死锁。这是因为在Repeatable read下产生了间隙锁。...在判断是否存在符合条件的记录,如果没有,就插入记录,此时,只有一个线程能插入成功,另一个线程会出现锁等待, 当第1个线程提交后,第2个线程如因为主键值重复,会出现异常。

    2.2K20

    SQL修改数据库

    如果SQL表中不存在新记录,则该语句将该记录插入该SQL表中。 如果记录存在,则该语句使用提供的字段值更新记录数据。使用对象属性插入数据可以使用ObjectScript插入一条或多条数据记录。...可以在插入、更新行、插入和更新行或查询行时计算此数据值。...例如,如果插入IDKey为17、18和19的记录,然后回滚此插入,则下一条要插入的记录的IDKey将为20。缓存查询的创建、修改和清除不是事务操作。...例如,如果进程删除了唯一的数据值,则该值在事务持续时间内被锁定。因此,在第一个事务完成之前,另一个进程无法使用相同的唯一数据值插入记录。这可以防止回滚导致具有唯一性约束的字段出现重复值。...提交未提交的隔离级别:对于其他用户进行查询(只读)访问,可以看到未提交的对数据的插入,更新和删除。如果未指定任何事务,则为默认设置。

    2.4K30

    SQL命令 INSERT OR UPDATE

    描述 INSERT或UPDATE语句是INSERT语句的扩展(它与INSERT语句非常相似): 如果指定的记录不存在,则INSERT或UPDATE执行INSERT。...如果指定的记录已存在,则INSERT或UPDATE执行更新。它使用指定的字段值更新记录。即使指定的数据与现有数据相同,也会进行更新。...单个记录的INSERT或UPDATE始终将%ROWCOUNT变量设置为1,并将已插入或更新的行的%ROWID变量设置为1。...对于表级权限: 无论实际执行的是什么操作,用户都必须拥有对指定表的INSERT和UPDATE权限。 如果使用SELECT查询插入或更新另一个表中的数据,则用户必须对该表具有SELECT权限。...他们将插入记录1到5。如果记录4已经存在,插入或更新将更新它。

    2.7K40

    「数据库架构」三分钟搞懂事务隔离级别和脏读

    脏读会导致您看到同一记录的两个版本,或者完全错过一条记录。 在单个事务中多次重新运行查询时,可能会出现幻像行。...实际上,您的数据存储在一个或多个索引中。在大多数关系数据库中,主索引被称为“聚集索引”或“堆”。(对于NoSQL数据库,术语有所不同。)因此,在执行插入操作时,它需要在每个索引中插入一行。...未提交的读取最容易理解。通过忽略写锁定,使用“读未提交”的SELECT语句可以在事务完全提交之前看到新插入或更新的行。如果该转换然后被回滚,那么从逻辑上讲,SELECT操作将返回从不存在的数据。...如果上述更新语句是在您加州记录的时间与您阅读德克萨斯州记录的时间之间执行的,则您可以看到客户1253两次;一次使用旧值,一次使用新值。 ? 漏读的发生方式相同。...由于SQL Server 2000和更早版本尚未提供行级版本控制,因此该版本已大量使用。尽管不再需要或不建议使用,但该习惯仍然存在。

    1.4K30

    MySQL中的锁机制

    根据索引对单行数据进行更新的加锁原理了解了,那如果更新操作涉及多个行呢,比如下面 SQL 的执行场景。...一条记录操作完成,再读取下一条记录,直至没有匹配的记录为止。 ? 2. 表锁 上面我们讲解行锁的时候,操作语句中的条件判断列都是有建立索引的,那么如果现在的判断列不存在索引呢?...在 MySQL 的常用引擎中 InnoDB 支持行锁,而 MyISAM 则只能使用 MySQL Server 提供的表锁。 3....MyISAM存储引擎支持并发插入,以减少给定表的读操作和写操作之间的争用: 如果MyISAM表在数据文件中没有空闲块(由于删除或更新导致的空行),则行始终插入数据文件的末尾。...当我们使用范围条件而不是相等条件去检索,并请求锁时,InnoDB就会给符合条件的记录的索引项加上锁;而对于键值在条件范围内但并不存在(参考上面所说的空闲块)的记录,就叫做间隙,InnoDB在此时也会对间隙加锁

    1.3K20

    漫谈MySQL的锁机制

    收到因删除记录而产生的中间空洞 删除操作不会重整整个表,只是把 行 标记为删除,在表中留下空洞 MyISAM倾向于在可能时填满这些空洞,插入时就会重用这些空间,无空洞则把新行插到表尾 3.2 MyISAM...但如果当前事务也需要对该记录进行更新,则很有可能造成死锁; 对于锁定行记录后需要进行更新操作的应用,应该使用排他锁语句. 4.5 实例 4.5.1 Innodb共享锁 session_1 session...; 对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)....,如果两个线程同时对相同条件记录用SELECT...ROR UPDATE加排他写锁 在没有符合该记录情况下,两个线程都会加锁成功 程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁...这种情况下,将隔离级别改成READ COMMITTED,就可以避免问题 当隔离级别为READ COMMITED时,如果两个线程都先执行SELECT...FOR UPDATE 判断是否存在符合条件的记录

    85260

    一文看懂这篇MySQL的锁机制

    对于SELECT语句,可以通过以下语句显式地给记录加读/写锁 共享锁(S) 排他锁(X) 共享锁语句主要用在需要数据依存关系时确认某行记录是否存在; 并确保没有人对这个记录UPDATE...但如果当前事务也需要对该记录进行更新,则很有可能造成死锁; 对于锁定行记录后需要进行更新操作的应用,应该使用排他锁语句. 4.5 实例 4.5.1 Innodb共享锁 session_1 session...会给符合条件的已有数据的索引项加锁; 对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)....大于101(这些记录并不存在)的“间隙”加锁 间隙锁的目的 防止幻读,以满足相关隔离级别的要求 对于上例,若不使用间隙锁,如果其他事务插入 empid 大于 100 的任何记录,; 那么本事务如果再次执行上述语句...在可重复读下,如果两个线程同时对相同条件记录用SELECT...ROR UPDATE加排他写锁 在没有符合该记录情况下,两个线程都会加锁成功 程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做

    1.3K20

    MySQL的锁1 MySql的三种锁2 表锁的锁模式3 MyISAM的并发锁4 InnoDB锁问题5 关于死锁6 总结7 索引与锁

    2,无论MyISAM表中有无空洞,都强制在表尾并发插入记录,若无读线程,新行插入空洞中 可以利用MyISAM的并发插入特性,来解决应用中对同表查询和插入的锁争用 例如,将concurrent_insert...UPDATE或DELETE 但如果当前事务也需要对该记录进行更新,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用select * from table_name where .....在应用中,如果不同的程序会并发存多个表,应尽量约定以相同的顺序访问表,这样可以大大降低产生死锁的机会 在程序以批量方式处理数据的时候,如果事先对数据排序,保证每个线程按固定的顺序来处理记录,也可以大大降低死锁的可能...程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁 这种情况下,将隔离级别改成READ COMMITTED,就可以避免问题 当隔离级别为READ COMMITED时,如果两个线程都先执行...SELECT...FOR UPDATE 判断是否存在符合条件的记录,没有,就插入记录。

    2K60

    【21】进大厂必须掌握的面试题-65个SQL面试

    完全联接: 当任何表中都存在匹配项时,完全联接将返回所有记录。因此,它将返回左侧表中的所有行和右侧表中的所有行。 Q16。您所说的非规范化是什么意思?...该语句允许条件更新或将数据插入表中。如果存在一行,则执行UPDATE;如果不存在,则执行INSERT。 Q39。递归存储过程是什么意思?...SQL是一种查询语言,允许您发出单个查询或执行单个插入/更新/删除操作,而PL / SQL是Oracle的”过程语言” SQL,它允许您编写完整的程序(循环,变量等)。...完成多项操作,例如选择/插入/更新/删除。 Q54。什么是视图? 视图是一个虚拟表,由表中包含的数据子集组成。由于不存在视图,因此占用的空间更少。视图可以合并一个或多个表的数据,这取决于关系。...什么是SQL中的自动增量? 自动递增关键字使用户可以创建一个唯一的数字,只要将新记录插入表中就可以生成该数字。每当使用PRIMARY KEY时,通常都需要此关键字。

    6.9K22

    Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day17】—— 数据库4

    1、单条循环插入 2、修改SQL语句批量插入 3、分批量多次循环插入 追问1:如果插入速度依旧很慢,还有没有其他的优化手段? 面试题3:你对建表字段是否该使用not null这个问题怎么看?...2、插入或更新   如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO … ON DUPLICATE KEY UPDATE …"语句:...此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。 "REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。...REPLACE INTO:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。...REPLACE INTO语法回顾:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。

    1.2K20

    MySQL锁机制和锁算法

    但是如果当前事务也需要对该记录进 行更新操作,则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用,应该使用SELECT…FOR UPDATE 方式获得排他锁。...,先尝试为该记录加上排他锁(exclusive locking) 如果加锁失败,说明该记录正在被修改,那么当前查询可能要等待或者抛出异常。...程序发现记录尚不存在,就试图插入一条新记录,如果两个线程都这么做,就会出现死锁。这种情况下,将隔离级别改成READ COMMITTED,就可避免问题。...(5)当隔离级别为READ COMMITTED 时,如果两个线程都先执行SELECT…FOR UPDATE,判断是否存在符合条件的记录,如果没有,就插入记录。...这样可以大大减少死锁的机会; 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响; 不要申请超过实际需要的锁级别;除非必须,查询时不要显示加锁; 对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能

    1.2K30

    MySQL实战中,Insert语句的使用心得总结

    1-2.插入或更新 如果我们希望插入一条新记录(INSERT),但如果记录已经存在,就更新该记录,此时,可以使用"INSERT INTO … ON DUPLICATE KEY UPDATE …"语句:...此时,可以使用"REPLACE INTO"语句,这样就不必先查询,再决定是否先删除再插入。 "REPLACE INTO"语句是基于唯一索引或主键来判断唯一(是否存在)的。...小tips: ON DUPLICATE KEY UPDATE:如果插入行出现唯一索引或者主键重复时,则执行旧的update;如果不会导致唯一索引或者主键重复时,就直接添加新行。...REPLACE INTO:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。...REPLACE INTO语法回顾:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。

    1.4K20

    大白话聊聊Innodb的锁机制

    ---- 用来保护 “自增长计数器” 的锁 在Innodb中对于每个含有自增长值的表来说,其都会对应一个自增长计数器,如果多个线程同时尝试插入记录,那么该计数器就会存在竞态,因此需要锁来确保自增过程的原子性...间隙锁本身是为了解决幻读问题的,幻读是指同一事务下,连续两次执行同样的SQL语句可能导致不同的结果,第二次的SQL语句可能会返回之前不存在的行 对于唯一键的精确查询而言,因为其唯一性确定了不可能存在两个相同...因为非唯一二级索引列的值是允许重复的,因此在精确查询场景下,为了避免同一事务下多次查询返回之前不存在的行,需要使用Gap Lock锁住其前后区间,防止插入相同值的记录,这里就是防止插入age=21的记录...---- 小结 在Innodb中,对于Insert操作,其会检查插入记录所在区间是否存在Next-Key Lock 或者 Gap Lock , 如果存在,当前插入操作阻塞等待。...幻读问题是指同一事务下,连续执行两次同样的SQL语句可能会导致不同的结果,第二次的SQL语句可能会返回之前不存在的行。

    1.3K60

    MySQL的死锁系列- 锁的类型以及加锁原理

    在 MySQL 的常用引擎中 InnoDB 支持行锁,而 MyISAM 则只能使用 MySQL Server 提供的表锁。...,则只需要在 id = 49 这个主键索引上加上写锁;第二条 SQL 则使用二级索引来查询,则首先在 name = Tom 这个索引上加写锁,然后由于使用 InnoDB 二级索引还需再次根据主键索引查询...根据索引对单行数据进行更新的加锁原理了解了,那如果更新操作涉及多个行呢,比如下面 SQL 的执行场景。...读写意向锁 由于表锁和行锁虽然锁定范围不同,但是会相互冲突。所以当你要加表锁时,势必要先遍历该表的所有记录,判断是否加有排他锁。...间隙锁 还是最开始更新用户年龄的例子,如果 id = 49 这条记录不存在,这个 SQL 语句还会加锁吗?答案是可能有,这取决于数据库的隔离级别。

    1.1K00

    MySQL的死锁系列- 锁的类型以及加锁原理

    在 MySQL 的常用引擎中 InnoDB 支持行锁,而 MyISAM 则只能使用 MySQL Server 提供的表锁。 ?...,则只需要在 id = 49 这个主键索引上加上写锁;第二条 SQL 则使用二级索引来查询,则首先在 name = Tom 这个索引上加写锁,然后由于使用 InnoDB 二级索引还需再次根据主键索引查询...根据索引对单行数据进行更新的加锁原理了解了,那如果更新操作涉及多个行呢,比如下面 SQL 的执行场景。...读写意向锁 由于表锁和行锁虽然锁定范围不同,但是会相互冲突。所以当你要加表锁时,势必要先遍历该表的所有记录,判断是否加有排他锁。...间隙锁 还是最开始更新用户年龄的例子,如果 id = 49 这条记录不存在,这个 SQL 语句还会加锁吗?答案是可能有,这取决于数据库的隔离级别。

    74530
    领券