Java:如何使用Java jdbc for Sql Server对标识列执行批插入
我有一个csv文件,需要使用它写入Sql Server表。我正在使用从文件加载数据 目标表具有以下结构:Java:如何使用Java jdbc for Sql Server对标识列执行批插入,java,sql-server,jdbc,bulkinsert,Java,Sql Server,Jdbc,Bulkinsert,我有一个csv文件,需要使用它写入Sql Server表。我正在使用从文件加载数据 目标表具有以下结构: create table TEST ( ID int identity, FIELD_1 int, FIELD_2 varchar(20) ) 4279895;AA00000002D 4279895;AA00000002D 4279895;AA00000002D 4279896;AA00000003E 4279896;AA00000003E 4279896;AA00
create table TEST
(
ID int identity,
FIELD_1 int,
FIELD_2 varchar(20)
)
4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E
csv文件具有以下结构:
create table TEST
(
ID int identity,
FIELD_1 int,
FIELD_2 varchar(20)
)
4279895;AA00000002D
4279895;AA00000002D
4279895;AA00000002D
4279896;AA00000003E
4279896;AA00000003E
4279896;AA00000003E
正如您所看到的,ID(identity)列不在csv中,我需要数据库在插入时自动添加identity值。
我的问题是,只要表具有标识列,大容量插入就无法工作,我得到了以下错误:
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执行标识大容量插入的正确方法是什么?我认为您不需要设置此选项
copyOptions.setKeepIdentity(false)代码>
请在删除此行后重试。你也可以参考这篇文章我想你不需要设置这个选项copyOptions.setKeepIdentity(false)代码>
请在删除此行后重试。如果您有一个前导列的值为空,那么您也可以参考这篇文章,插入时将生成标识。根据设置,它可能会生成新标识,即使第一列不是空的
因此,要么添加一个额外的列,要么使用另一个(staging)表
顺便说一句,如果您有一个非常大的表,那么命令行bcp实用程序是最快的。根据经验,与Jdbc批量插入相比,速度快5倍。如果前导列的值为空,则在插入时将生成标识。根据设置,它可能会生成新标识,即使第一列不是空的
因此,要么添加一个额外的列,要么使用另一个(staging)表
顺便说一句,如果您有一个非常大的表,那么命令行bcp实用程序是最快的。根据经验,与Jdbc批量插入相比,速度快5倍