MySQL - 如何在一个 UPDATE SELECT 语句中更新一个单元格两次?

问题描述 投票:0回答:1

查询如下:

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
1个回答
0
投票

我进行了测试,确认 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
语法。

© www.soinside.com 2019 - 2024. All rights reserved.