zoukankan      html  css  js  c++  java
  • MySql中的有条件插入 insert where

    假设现在我们有这样的需求:当数据库中不存在满足条件的记录时,可以插入一条记录,否则程序退出。该怎么实现?

    1年以上工作经验的人应该都能立即想到:去检查一下库里有没有记录,没有就插入,有就结束。

    int count = selectFromDb(); // ①
    if count > 0 {
          return;
    } else {
          insertIntoDb(); // ②
    }
    

    2年以上工作经验的在写完上面的逻辑后会立即发现:在并发场景下这样并不安全。如果两个线程同时执行到①这里,都会发现数据库没有记录,于是分别执行了②。所以在并发场景下,这里需要使用分布式锁。

    int count = selectFromDb(); // ①
    if count > 0 {
          return;
    } else {
          try (getLock()) {// ③
                count = selectFromDb(); // ④
                if (count == 0) {
                    insertIntoDb(); // ②
                }
          }
    }
    

    这里在③处加了分布式锁,然后看一下的确没有数据再插入。

    这篇文章要说的是使用数据库的sql执行机制来保证并发锁的实现。当然了,如果条件允许,使用唯一键冲突也是可以的。

    在我们日常处理数据的时候,都是可以使用条件的,比如最简单的select where,最普通的update where等等。如果我们在插入的时候也可以使用where这个问题不就解决了吗。

    当然了,正因为mysql没有提供这种语法,所以我们才在这里讨论这个问题。

    mysql提供了根据已有数据来插入表的机制,就是非著名的insert select。所以我们的突破口就在这里,既然这里有select我们就在这里的select加where,因为insert select的实现是select不出东西的时候是不会插入的。
    所以这里我们这样写

    insert into t(id, c1, c2) select 1, "","" from dual where not exists (select * from t where c1="")
    

    这里的where c1=""假设就是我们的条件①。

  • 相关阅读:
    HTML+CSS简单实现导航栏二级下拉菜单
    原创 | 我的个人微信公众号
    原创 | 喂,在吗?
    NodeJs实现邮箱验证
    JS排序算法(二)冒泡排序
    JS排序算法(一) 快速排序
    前端常见的布局方式
    JS继承方式
    前端Node实现简易的文件上传下载
    原生js实现深度克隆
  • 原文地址:https://www.cnblogs.com/somefuture/p/14105436.html
Copyright © 2011-2022 走看看