【问题标题】:Batch insert to database with skipping duplicates found in database批量插入数据库,跳过数据库中发现的重复项
【发布时间】:2020-06-19 09:53:53
【问题描述】:

我想使用 Spring 将对象列表保存到数据库中。在我的控制器中,我收到一个字符串列表,说这些是城市。我过滤掉重复的并拥有一个独特的Set 城市。当我对 city 列有唯一约束时,如何插入该设置数据库? 我在这里看到三个选项:

  1. 在任何插入之前,我都会检查是否已经有这样的记录,如果没有,我会保留域对象。

  2. 我尝试持久化对象域对象而不检查它是否存在于数据库中。当我遇到 SQL 异常时,我尝试保存另一个域对象。

  3. 我从数据库中检索所有对象(记录列表肯定会超过 10 万条),然后创建一组唯一的(数据库中不存在的)域对象,然后将它们保存到数据库中。

有什么选择?有(希望)更好的选择吗?

【问题讨论】:

  • 您能否创建一个全局临时表或访问一个可以暂存数据的空表?对于这样的操作,总是最好在数据库端进行处理
  • 是的,我可以做到这一点。

标签: sql spring oracle hibernate spring-data


【解决方案1】:

您可以创建一个由 oracle 用户拥有的 global temporary table,该用户使用与目标表相同的结构进行插入。下面的伪代码应该给你一个想法。最简单的方法是使用 ON COMMIT DELETE ROWS 创建它,但有时使用 ON COMMIT PRESERVE ROWS 并使用

开始每个会话会更容易
DELETE FROM <your global temporary table>;

然后将 Spring 中的所有数据插入此表中。我将假设目标表中没有重复的 ID 或具有相同 ID 的重复城市。

INSERT INTO <your destination table> SELECT city_id, city_name, third_field
FROM <your global temporary table> 
WHERE <your global temporary table>.city_name
NOT IN (SELECT <your destination table>.city_name
FROM <your destination table>);

如果您有不同 ID 的重复城市名称,您可以添加另一个 NOT IN 子句。

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多