Как пакетно вставить данные в две таблицы с соотношением 1: n, используя? - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу вставить данные в две таблицы с отношением 1: n.Объем данных довольно велик, поэтому я хочу использовать пакетный оператор для вставки в мои таблицы.Проблема в том, что когда я делаю это с моей «родительской» таблицей, я не могу назначить данные в моей «дочерней» таблице соответствующей родительской записи.

У меня есть три таблицы, скажем, перваяназывается Data, второй - Employee, а третий - EmployeeData.В таблице «Данные» - огромное количество данных, которые я собираюсь обработать в своем приложении.Теперь, после обработки данных, у меня есть набор данных для нескольких сотрудников.Сначала я хочу создать запись для каждого сотрудника в моем наборе данных в таблице Employee, а затем создать записи для соответствующих данных этого сотрудника в моей таблице EmployeeData.

Sql sql = new Sql(conn)

employees.each {
    def employeeId = sql.firstRow("select coalesce(max(id), 1) from employee")

    sql.executeUpdate("""
        insert into employee (id, firstname, lastname)
        values (:id, :firstname, :lastname)
    """, [id: employeeId, fistname: it.firstname, lastname: it.lastname])

    sql.withBatch("""
        insert into employee_data (id, working_hours)
        values (nextval('employee_data_id_seq'), :hours)
    """) { stmt ->
        employees.data.each {
            stmt.addBatch([
                    hours: it.hours
            ])
        }
    }
}

Я использую Groovy SQL длявзаимодействие с базой данных.К сожалению, я также не могу использовать автоинкремент в моей базе данных по некоторым причинам, поэтому я написал свою собственную последовательность для генерации идентификаторов для вставки.Это простая версия моего реального материала, в реальном приложении у моих таблиц намного больше столбцов.Есть около 300 000 наборов данных для вставки в EmployeeData.Это работает, но для вставки всех данных требуется некоторое время.Есть ли лучший способ решить эту задачу?

...