查询如下:
UPDATE items, (VALUES ROW('sku1', 1), ROW('sku1', 2)) newavail
SET available = available + newavail.column_1`
WHERE items.sku = newavail.column_0;`
此查询应该将新到达的货物添加到仓库。有时,您将同一商品装在多个盒子中运送,因此您将在一份声明中多次添加“sku1”。
但是,MySQL 不会再更新“sku1”行一次。实际结果是 items.available 将+1,但预期是+3。
如何修改查询以允许对同一表格单元格进行多次修改?
我进行了测试,确认 MySQL 会覆盖该值,而不是逐步添加该值。
我认为这是因为手册中的内容:
如果您访问表中要在表达式中更新的列,
将使用该列的当前值。UPDATE
在这种情况下,赋值右侧对
available
的引用始终基于 UPDATE 之前的原始值。
SET available = available + newavail.column_1
^^^^^^^^^
original value, not cumulative
我通过在进行作业之前对值进行求和,使您的更新按以下方式工作。
UPDATE items JOIN (
SELECT sku, SUM(incoming) FROM (
VALUES ROW('sku1', 1), ROW('sku1', 2)
) AS t(sku, incoming)
GROUP BY sku
) AS newavail(sku, incoming) USING (sku)
SET available = available + newavail.incoming;
演示:https://dbfiddle.uk/mCWbjp7M
我还稍微修改了语法,以展示如何为派生表定义列别名,并且我使用了显式
JOIN...USING
语法。