首页 > 解决方案 > MySQL:插入...如果计数 <= 库存其他不做

问题描述

我有一个仓库系统,您可以在其中插入或移除带有条形码和计数的产品。现在我想在执行交易之前先检查库存中是否有足够的产品。就像这样:如果库存中有足够的产品则插入交易否则不做任何事情(或显示错误)

我试过这段代码:

SELECT CASE WHEN 7 <= (SELECT i.count FROM inventory i WHERE barcode = '123')
THEN 
    INSERT INTO transactions 
           (companyid,barcode,fromlocation,tolocation,count) 
    VALUES (1,'123','Warehouse','Factory',7)
END

但它说:

1. Unexpected keyword. (near "INTO" at position 88)
2. Unexpected end of CASE expression (near " " at position 87)
3. Unrecognized keyword. (near "END" at position 198)

所以显然这是错误的语法,但我到处搜索,找不到提供这种情况的 if 语句。

有人可以告诉我如何编写正确的 if 语句吗?

我知道我可以先创建一个 select 语句,比较值,然后插入事务(使用 MySQL beginTransaction 和 commit),但我很确定必须有另一种方式。(当我谈论事务时,我不谈论来自 MySQL 的事务,而是谈论来自我的数据库的事务)

谢谢

标签: mysqlif-statementinsert

解决方案


我还没有对此进行测试,但它应该可以完成工作。

在 TSQL 中,您将分隔IFand IIF,仅IIFSELECT语句中使用(与CASE您使用的相同)并IF用作标准 IF(与任何其他语言一样)。在 MySQL 中,这两个是相同的,只是IF(或在您的示例CASE中的SELECT语句中),在这种情况下,为了获得您想要的结果,下面的代码应该可以工作:

DELIMITER $$

CREATE PROCEDURE test() 
BEGIN
    IF 7 <= (SELECT i.count FROM inventory WHERE barcode = '123') THEN
        INSERT INTO transactions 
        (companyid,barcode,fromlocation,tolocation,count) 
        VALUES (1,'123','Warehouse','Factory',7);
    END IF;
END$$

DELIMITER ;

CALL test;    

推荐阅读