首页 > 解决方案 > Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入

问题描述

我有一个 csv 文件,我需要使用SQLServerBulkCopy将其写入 Sql Server 表。我正在使用SQLServerBulkCSVFileRecord从文件中加载数据。

目标表具有以下结构:

create table TEST
(
    ID int identity,
    FIELD_1 int,
    FIELD_2 varchar(20)
)

csv 文件具有以下结构:

4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E

如您所见,csv 中不存在 ID(身份)列,我需要数据库在插入时自动添加身份值。我的问题是,只要表有标识列,批量插入就不起作用,我收到以下错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Source and destination schemas do not match.
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.validateColumnMappings(SQLServerBulkCopy.java:1749)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:1579)
    at com.microsoft.sqlserver.jdbc.SQLServerBulkCopy.writeToServer(SQLServerBulkCopy.java:606)

这是相关代码:

try (
        Connection targetConnection = DriverManager.getConnection(Configuration.TARGET_CONNECTION_URL);
        SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(targetConnection);
        SQLServerBulkCSVFileRecord fileRecord = new SQLServerBulkCSVFileRecord(csvPath, Charsets.UTF_8.toString(), ";", false);
) {

    SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
    copyOptions.setKeepIdentity(false);

    bulkCopy.setBulkCopyOptions(copyOptions);

    fileRecord.addColumnMetadata(1, null, java.sql.Types.INTEGER, 0, 0); // FIELD_1 int    
    fileRecord.addColumnMetadata(2, null, java.sql.Types.VARCHAR, 20, 0); // FIELD_2 varchar(20)

    bulkCopy.setDestinationTableName("TEST");                
    bulkCopy.writeToServer(fileRecord);

}

catch (Exception e) {

    // [...]

}

如果我从表中删除标识列,则批量插入成功结束。使用 java jdbc for Sql Server 执行身份批量插入的正确方法是什么?

标签: javasql-serverjdbcbulkinsert

解决方案


我认为您不需要设置此选项copyOptions.setKeepIdentity(false);

删除此行后尝试。您也可以参考这篇文章SqlBulkCopy Insert with Identity Column


推荐阅读