一个愚蠢但简单的例子:假设我有一个表Item
,我在其中保存了我收到的物品的总数。有两列:Item_Name
(主键)和Items_In_Stock
(金额)。
当我收到数量为X的物品A时:
- 如果该项目不存在,则为项目A插入一条新记录,并将库存项目设置为X。
- 如果存在物料A的记录,其中库存物料为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语句是个好主意吗?
当然我可以用代码来做,但有更好的方法吗?
6条答案
按热度按时间ws51t4hk1#
正如我在评论中提到的,你不必做子选择来引用导致ON DUPLICATE KEY触发的行。所以,在你的例子中,你可以使用以下代码:
字符串
记住,大多数事情都很简单,如果你发现自己把应该简单的事情复杂化了,那么你很可能做错了:)
2mbi3lxu2#
虽然Michael的答案是正确的,但你需要知道更多的知识来编程地执行upsert:
首先,创建表并指定要在哪些列上创建唯一索引:
字符串
然后在其中插入一些值:
型
再次尝试执行同样的操作,你会得到一个重复键错误,因为
cellId
和entityRowId
是相同的:型
关键字"id_ce"的重复条目"1 - 199"
这就是为什么我们使用upsert命令:
型
此命令将已经存在的值
1.0
作为值,并执行value = value + 300.0
。因此,即使在执行上述命令后,表中也只有一行,值为
301.0
。dgtucam13#
你可以从这个例子中得到启发:
假设您要添加用户明智的七天数据
它应该有唯一的值为userid和天一样
字符串
这是table
型
你的问题是
型
范例:
型
您的数据将在表中:
型
pbwdgjma4#
这是upsert的语法
字符串
vhipe2zx5#
如果PK列的值或列上的唯一索引满足唯一性,则可以使用
INSERT IGNORE
、INSERT INTO ... ON DUPLICATE
或REPLACE
INSERT IGNORE
示例字符串
INSERT INTO .. ON DUPLICATE KEY UPDATE
示例型
Replace
示例型
rqdpfwrv6#
Upsert示例
字符串