Во-первых, здесь краткое изложение вопроса:
Можно ли условно выполнить оператор INSERT
?
Что-то похожее на это:
IF(expression) INSERT...
Теперь я знаю, что могу сделать это с помощью хранимой процедуры. Мой вопрос: могу ли я сделать это в моем запросе?
Теперь, зачем мне это делать?
Предположим, что у нас есть следующие 2 таблицы:
products: id, qty_on_hand
orders: id, product_id, qty
Теперь, скажем, приказ о 20 куклах Voodoo (номер продукта 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
.
Пока все хорошо.
Однако есть проблема с concurrency.
Если в тот же момент приходят 2 заказа, они могут прочитать количество на руках, прежде чем какой-либо из них введет порядок.
Затем они будут размещать заказ, превышая qty_on_hand
.
Итак, вернемся к корню вопроса:
Можно ли условно выполнить оператор INSERT
, чтобы мы могли объединить оба эти запроса в один?
Я искал много, и единственный тип условного оператора INSERT
, который я мог найти, был ON DUPLICATE KEY
, который, очевидно, здесь не применяется.