1. 程式人生 > 實用技巧 >MySql中的有條件插入 insert where

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=""假設就是我們的條件①。