当前位置: 首页 > 面试题库 >

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

鱼征
2023-03-14
问题内容

愚蠢但简单的示例:假设我有一个表“ 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语句是一个好主意吗?

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


问题答案:

如我的评论中所述,您不必进行子选择即可引用导致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

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



 类似资料:
  • 问题内容: 我试图在Spring Rest Controller中使用PUT请求方法部分更新实体时区分空值和未提供值。 以以下实体为例: 我的人资料库(Spring数据): 我使用的DTO: 我的Spring RestController: 请求缺少属性 预期行为:更新(保留不变)。 具有空属性的请求 预期行为:更新并设置。 我无法区分这两种情况,因为在DTO中,总是由Jackson 设置。 注意

  • 在我的ionic3项目中,我使用插件来访问基于旧相机API的相机。但是我想手动聚焦,这是一个只有通过新的API才能实现的功能。到目前为止,我还没有找到为新的API编写的Cordova插件。 换句话说,我可以使用API捕获照片,并使用API设置焦点吗?

  • 问题内容: 我只需要解码和更新json对象的特定值。问题是我不知道对象的完整结构。encoding / json包“忽略” /截断了结构中未提供的字段,因此对这些字段进行编码会丢失。我想知道是否有可能仅解组我知道的结构,对其进行更新,然后再进行组封而不截断/删除未知的结构/信息。 问题答案: 似乎有可能。

  • 问题内容: 我应该如何在MySQL中存储出生日期,以便可以通过Cron Job轻松地每天更新每个人的年龄? 存储“年龄”和“生日”是否有意义,以便在进行涉及“年龄”的搜索时,我不必即时计算每个“年龄”并浪费CPU资源? 如果是这样,我应该如何1)存储生日,以及2)每天计算年龄? 我可以想象每天的cron脚本会首先过滤出其生日不是当前月份的用户,然后过滤出其生日不是当前日期的用户,然后将每个剩余用户

  • Solr4提供了对索引中现有文档进行原子(部分)更新的功能。即。可以匹配文档ID并替换一个字段的内容,或者向多值字段添加更多条目:http://wiki.apache.org/solr/atomicupdates 原子更新可以从DataImportHandler(DIH)完成吗?

  • 问题内容: 我的目的是观察范围内的模型,并找出旧值和新值之间的差异。 但是,我发现以下代码中的旧值和新值都相同。 输出: 它们为什么相同,如果是故意的,为什么? 这是代码,http://plnkr.co/edit/rfMCF4x6CmVVT957DPSS?p=preview 问题答案: 您可以改用,这似乎可行。如果您还想监视对象上的所有属性(如您所做的那样),则需要将第三个参数添加到监视中。这建立