首先,这里的问题的简明摘要: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