首页 > 解决方案 > 使用 JDBC 批量插入具有外键的多个表

问题描述

我正在编写一个接收树结构并将其插入数据库的方法,其中每个分支都是另一个数据库表。例如:

tree = {
    "_id": "111",
    "field1": "",
    "field2": "",
    "field3": {
        "_id": "333",
        "_parent_id": "111",
        "field3_1": "",
        "field3_2": "",
        "field3_3": [
            {
                "_id": "1",
                "_parent_id": "333",
                "field3_3_1": ""
            },
            {
                "_id": "2",
                "_parent_id": "333",
                "field3_3_1": ""
            },
            {
                "_id": "3",
                "_parent_id": "333",
                "field3_3_1": ""
            }
        ]
    }
}

应对应于 3 个表:tree、field3 和 field3_3 - 与 _id 和 _parent_id 有关系。每个分支可以是单个值、表或对象,基本上树是对应于 PostgreSQL 数据库中某些数据结构的动态结构。我正在使用 jdbc 将数据插入数据库。当用户可能会提供具有多个分支或多个分支值的大树时,插入此类数据的最佳方法是什么?我在想这样的声明:

                 with first_insert as(
                 insert into sample(firstname, lastname)
                 values('fai55', 'shaggk')
                 RETURNING id
                 ),

                 second_insert as(
                 insert into sample1(id, adddetails)
                 values
                 ((select id from first_insert), 'ss')
                 RETURNING user_id
                 )

但是如果内部插入应该在大批量记录上工作(field3_3 将包含每个数据行的 100k 条记录),问题就会出现。

我已经使用 PreparedStatement 和 executeBatch() 在单个数据库级别实现了接受表和插入的方法,并且效果很好。像这种方法一样,可用于树木吗?

标签: javajdbcinsertbatch-processingrelation

解决方案


我已经通过以下方式解决了这个问题:我从树的一层中获取元素,并将其所有非对象值插入到preparedStatement 批处理中(它们在一个表中),返回插入的记录ID。然后我获取每个插入元素的子元素,分配正确的 parent_id 并将它们批量插入另一个表和另一个表。效果很好!


推荐阅读