まず、ここで問題の簡潔な概要です: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');
次に、trueと評価すると、INSERT
というクエリが実行されます。
これまでのところとても良いです。
ただし、並行性に問題があります。
正確に同じ時刻ので2つの注文が届いた場合、その注文のいずれかが注文に入る前に、数量を読み込んでいる可能性があります。 これで注文は両方とも行われますので、qty_on_hand
を超えています。だから、戻って質問のルートに
:
それは我々が一つにこれらのクエリの両方を組み合わせることができるように、条件付きでINSERT
ステートメントを実行することは可能ですか?
私は多くを検索しました。条件付きINSERT
の唯一のタイプはON DUPLICATE KEY
でしたが、これは当然当てはまりません。
@Bohemian:2つのSELECT文は必要ありません。 1つで十分です。私の答えを見てください。 :) – Shef
本当ですが、私は私の*一般的な*パターンにマッチさせようとしていました。私はあなたの答えが好きです... +1 – Bohemian
@ジョセフ・シルバー:何をするか???その減算はどこにありますか?減算と正規化とは何が関係していますか? :D上記のクエリは、私と比較して2つの「SELECT」文で構成されていることを理解していますか? (あなたの答え、またはあなた、ボヘミアンに対して何もない)。 – Shef