MySQL INSERT IF (настраиваемые операторы if)

Во-первых, вот краткое изложение вопроса:

Можно ли запустить INSERT оператор условно? Что-то вроде этого:

IF(expression) INSERT...

Теперь я знаю, что могу сделать это с помощью хранимой процедуры. У меня вопрос: могу ли я сделать это в своем запросе?


А зачем мне это делать?

Предположим, у нас есть следующие 2 таблицы:

products: id, qty_on_hand
orders: id, product_id, qty

Теперь допустим заказ на 20 кукол вуду (идентификатор продукта 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 .
Пока все хорошо.


Однако есть проблема с параллелизмом.
Если 2 заказа поступят в в одно и то же время , они оба могут прочитать количество в наличии до того, как любой из них введет заказ. Затем они оба разместят заказ, таким образом превышая qty_on_hand .


Итак, вернемся к корню вопроса:
Можно ли выполнить оператор INSERT условно, чтобы мы могли объединить оба этих запроса в один?

Я много искал, и единственный тип условного оператора INSERT что я смог найти, это ON DUPLICATE KEY , что, очевидно, здесь не применяется.

32
задан Joseph Silber 18 August 2011 в 04:15
поделиться