如何通过关联另一张表执行减法操作更新数据库列?
多表关联更新问题
现有两张数据库表cart和cages,需要通过匹配cart表的item_name与cages表的name,用cages表的remaining列减去对应cart表的quantity列,来更新cages的remaining字段。
表结构示例
cages表
| id | name | total | remaining |
|---|---|---|---|
| 1 | Cage1 | 10 | 10 |
| 2 | Cage2 | 15 | 15 |
| 3 | Cage3 | 10 | 10 |
cart表
| id | item_name | quantity |
|---|---|---|
| 1 | Cage1 | 2 |
| 2 | Book4 | 3 |
你尝试的SQL语句存在语法错误,无法正确执行:
UPDATE cages SET remaining = (remaining - cart.quantity WHERE cart.item_name = cages.name);
正确的SQL写法
根据不同数据库类型,有两种常见实现方式:
方式一:JOIN关联更新(适配MySQL、PostgreSQL等多数数据库)
UPDATE cages JOIN cart ON cages.name = cart.item_name SET cages.remaining = cages.remaining - cart.quantity;
该语句会直接关联两张表,仅更新cages中与cart匹配的行——比如示例中只会把Cage1的remaining从10更新为8,Cage2、Cage3不受影响,cart中Book4因无匹配项不会触发任何更新。
方式二:子查询写法(通用适配更多数据库)
UPDATE cages SET remaining = remaining - ( SELECT COALESCE(quantity, 0) FROM cart WHERE cart.item_name = cages.name );
这里用COALESCE函数处理无匹配的情况:即使cages中的name在cart中不存在,remaining也会保持原值(减去0),避免变为NULL。若业务不需要处理无匹配场景,可去掉COALESCE,但此时无匹配的行remaining会被设为NULL,需按需选择。
注意事项
- 更新前建议先执行
SELECT验证关联逻辑,避免误更新:SELECT cages.name, cages.remaining, cart.quantity, cages.remaining - cart.quantity AS new_remaining FROM cages LEFT JOIN cart ON cages.name = cart.item_name; - 若
cart表中存在同一item_name的多条记录,需先聚合quantity,否则会重复减去数值:UPDATE cages JOIN ( SELECT item_name, SUM(quantity) AS total_quantity FROM cart GROUP BY item_name ) AS cart_sum ON cages.name = cart_sum.item_name SET cages.remaining = cages.remaining - cart_sum.total_quantity;
内容的提问来源于stack exchange,提问作者RTM
相关产品推荐
相关产品推荐

