一尘不染

如何执行UPSERT,以便在更新部分中可以同时使用新值和旧值

mysql

愚蠢但简单的示例:假设我有一个表“ Item”,其中保存接收到的项目的总数。

Item_Name              Items_In_Stock

项目名称是此处的主键。每当我收到数量为X的物料A时,如何实现以下目标。

如果该商品不存在,则为商品A插入一个新的摘要,并将库存商品设置为X;如果存在一条记录,其中库存商品为Y,则库存商品的新值为(X + Y)

INSERT INTO `item`
(`item_name`, items_in_stock)
VALUES( 'A', 27)
ON DUPLICATE KEY UPDATE
`new_items_count` = 27 + (SELECT items_in_stock where item_name = 'A' )

我的问题是我的实际表中有多个列。在更新部分中编写多个select语句是一个好主意吗?

我当然可以用代码完成,但是有更好的方法吗?


阅读 458

收藏
2020-05-17

共1个答案

一尘不染

如我的评论中所述,您不必进行子选择即可引用导致ON DUPLICATE KEY触发的行。因此,在您的示例中,您可以使用以下代码:

INSERT INTO `item`
(`item_name`, items_in_stock)
VALUES( 'A', 27)
ON DUPLICATE KEY UPDATE
`new_items_count` = `new_items_count` + 27

请记住,大多数事情实际上都是很简单的,如果您发现自己过于复杂了一些本来应该简单的事情,那么您很可能会以错误的方式来做:)

2020-05-17