首先,這裏的問題的簡明摘要:MySQL的INSERT IF(自定義if語句)
是否可以有條件地運行INSERT
聲明? 一種近乎此:
IF(expression) INSERT...
現在,我知道我可以用一個存儲過程做到這一點。 我的問題是:我可以在我的查詢中做到這一點?
現在,我爲什麼要這麼做?
假設我們有以下2個表:
products: id, qty_on_hand
orders: id, product_id, qty
現在,讓我們說20個巫毒娃娃(產品ID 2)的訂單進來
我們首先檢查是否有足夠數量的手:
SELECT IF(
(SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
(SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
然後,如果計算結果爲真,我們運行一個INSERT
查詢。
到目前爲止這麼好。
但是,併發性存在問題。
如果兩個訂單在完全相同的時間進來,它們可能都會在其中任何一個訂單進入訂單之前讀取數量。 然後他們會下訂單,因此超過了qty_on_hand
。
所以,回到問題的根源:
是否可以有條件地運行INSERT
聲明,這樣我們就可以這兩個查詢合併成一個?
我搜索了很多,而且我能找到的條件INSERT
聲明的唯一類型是ON DUPLICATE KEY
,這在這裏顯然不適用。
@Bohemian:不需要兩個'SELECT'語句。一個就足夠了。看看我的答案。 :) – Shef
是的,但我試圖匹配我的* general *模式。我喜歡你的答案,但... +1 – Bohemian
@約瑟夫西爾伯:做什麼?那裏的減法在哪裏?減法與標準化有什麼關係? :D你是否明白上面的查詢是由兩個'SELECT'語句組成的,與我的相比,它運行一個? (沒有任何反對你的答案,或者你,波西米亞人)。 – Shef