【发布时间】:2019-02-13 16:11:19
【问题描述】:
我正在尝试创建一个触发器,将input_qty 的值与shelf_qty 的值相加,然后设置input_qty = 0。
这是我的尝试:
DELIMITER $$
CREATE TRIGGER inventory_update
AFTER UPDATE ON `products`
FOR EACH ROW
IF OLD.`input_qty` > 0 THEN
BEGIN
DECLARE new_shelf_qty INT(11);
SET new_shelf_qty := OLD.`input_qty` + OLD.`shelf_qty`;
UPDATE `products` SET `input_qty` = 0, `shelf_qty` = new_shelf_qty;
END $$
DELIMITER;
我设法通过修改 Gordon 的答案使其“工作”,但触发器会创建一个无限循环并且不会更新任何内容。
DELIMITER $$
CREATE TRIGGER inventory_update
BEFORE UPDATE ON `products`
FOR EACH ROW
BEGIN
DECLARE new_shelf_qty INT(11);
IF OLD.`input_qty` > 0 THEN
SET new_shelf_qty = OLD.input_qty + OLD.shelf_qty;
SET new.input_qty = 0;
END IF;
END $$
更新
我会使用这样的东西:
UPDATE product t
SET t.shelf_qty = t.shelf_qty + 1
WHERE t.id = 1 ;
但问题是我的服务器上组装好的sql查询是这样的:
UPDATE `products`
SET `qty` = CASE
WHEN `sku` = 'foo' THEN `qty` + qty1
WHEN `sku` = 'bar' THEN `qty` + qty2
...
END;
更新 2
查询的数据是从这样的表格中收集的:
<input id="sku1" type="number">
<input id="sku2" type="number">
<input id="sku3" type="number">
...
<input type="submit" value="Save">
print(POST body) //[{sku1:qty1}, {sku2:qty2}, {sku3:qty3}...]
表单仅在进行更改时提交项目/数量对象的列表。数量字段是增加库存的数量,而不是实际数量。
据我所知,THEN 之后的操作是不允许的,我能想到的用 1 个查询来实现这一点的唯一方法是使用我尝试的触发器(这显然不起作用)。任何建议都将不胜感激:)
接受的答案:
这对我有用:
UPDATE products t
SET t.qty = t.qty
+ CASE t.sku
WHEN 'foo' THEN 1
WHEN 'bar' THEN 2
ELSE 0
END
WHERE t.sku IN ('foo','bar')
【问题讨论】:
-
CASE表达式中的THEN关键字后面可以使用表达式(允许在表达式中进行加法运算)。 “组装的 sql 查询”显示的语法是有效的,我们希望在END之前有一个ELSE qty... 在没有WHERE子句的情况下执行UPDATE有点奇怪(更新表中的每一行)。 (我们无法验证语义,例如sku和qty是否是有效的列引用。) -
UPDATE product t SET t.qty = t.qty + CASE t.sku WHEN 'fee' THEN 1 WHEN 'fi' THEN 2 ELSE 0 END WHERE ...就我个人而言,我会做同样的事情,但我不确定我们应该在什么时候分配给qtysku未列出...我的假设是我们将保持这些行上的qty值不变。我只是不了解触发器对这个用例的好处,