Во-первых, вот краткое резюме вопроса:
Можно ли условно выполнить оператор 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');
Затем, если оно оценивается как true, мы запускаем запрос INSERT
.Пока все хорошо.
Однако есть проблема с параллелизмом.Если два заказа поступают в в одно и то же время , они оба могут прочитать имеющееся количество до того, как какой-либо из них поступит в заказ.Затем они оба разместят заказ, таким образом, превысив qty_on_hand
.
Итак, вернемся к корню вопроса:Можно ли условно выполнить оператор INSERT
, чтобы мы могли объединить оба этих запроса в один?
Я много раз искал, и единственный тип условного оператора INSERT
, который я смог найти, былON DUPLICATE KEY
, что здесь явно не применимо.