【问题标题】:Question about upsert a list of data solution [closed]关于插入数据解决方案列表的问题[关闭]
【发布时间】:2021-10-07 18:54:09
【问题描述】:

我有一个包含以下字段的客户表:ID、姓名、年龄、电话号码、内容、地址。

姓名+年龄+电话号码是唯一的。

我有一个带有请求正文的 upsert POST API:

[
   {
      "name": "A",
      "age": 100,
      "phoneNumber": 1000,
      "content": "content",
      "address": "address"
   }, ...
]

我的要求在这里检查姓名+年龄+电话号码是否存在,进行客户更新。如果没有,请进行客户插入。 我的解决方案是:循环请求列表-> 根据姓名+年龄+电话号码检查数据库以分为 2 个列表:insertList 和 updateList。之后在每个列表上使用 saveAll()。

但是如果列表有 1000 条记录,我需要点击 DB 1000 次才能分离。我认为我的解决方案不好,那么您有其他性能更好的解决方案吗?我正在使用 java 8 和 oracle DB。

【问题讨论】:

  • 你应该可以在 Oracle 中做一个MERGE
  • @g00se 你有这个动作的语法吗?我只知道:repo.save()、repo.saveAll() 和 repo.saveAndFlush()
  • 你提到了oracle和java。如果您使用的是一些中间软件,那么它是不相关的

标签: java oracle jpa


【解决方案1】:

据我了解,您不想点击 DB 1000 时间来检查是否必须插入或更新。一种方法是,遍历您的请求,将所有姓名+年龄+phNumber 收集到一个列表中,现在完成此操作后,用列表点击一次 db 并找出要插入的数量和要更新的数量。

【讨论】:

    【解决方案2】:

    我不会说 Java,但我有一个建议。

    在数据库中创建一个新表(包含您提到的所有列 - 姓名、年龄……)(我们称之为 list_table)并将这 1000 条记录存储在其中。正如我所说,我不了解 Java,所以我不知道它实际上做了多少工作,但我认为它不应该太复杂。

    完成后,切换到 SQL 并使用 merge 语句,该语句将在没有时间完成目标表的upsert

    merge into target_table a
      using (select name, age, phonenumber, content, address
             from list_table
            ) b
      on (a.name        = b.name and
          a.age         = b.age  and
          a.phonenumber = b.phonenumber
         )
      when matched then update set
        a.content = b.content,
        a.address = b.address
      when not matched then insert (name, age, phonenumber, content, address)
        values (b.name, b.age, b.phonenumber, b.content, b.address);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2010-12-28
      • 2011-11-27
      • 2021-01-17
      相关资源
      最近更新 更多