mysql - 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 的事务,而是谈论来自我的数据库的事务)
谢谢
解决方案
我还没有对此进行测试,但它应该可以完成工作。
在 TSQL 中,您将分隔IF
and IIF
,仅IIF
在SELECT
语句中使用(与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;
推荐阅读
- c# - 在列表中查找元素并将其设置为第一个元素
- php - 数据库不使用 php 和 jquery 更新
- caching - 如何仅通过查看内核代码来检测 L0、L1、L2 缓存可能溢出?
- regex - 使用 REGEX 进行案例分析
- grafana - 带有 QuestDb 的 Grafana 断开连接
- html - 如何在单独的页面中打印列表中的每一行。NetSuite 高级 PDF
- google-bigquery - 在每个用户的 bigQuery 中选择数据集中的最后一个 user_property
- python - 通过 pymeasure 连接 Thorlabs 功率计
- r - 闪亮在 R 文件夹上运行不需要的脚本
- android - 键盘处于活动状态时,登录和注册页面不滚动,颤动应用程序