java - 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 执行身份批量插入的正确方法是什么?
解决方案
我认为您不需要设置此选项copyOptions.setKeepIdentity(false);
删除此行后尝试。您也可以参考这篇文章SqlBulkCopy Insert with Identity Column
推荐阅读
- kotlin - 如何使用 Jetpack Compose 按钮后面的视图检测点击?
- bash - 复制目录并保留文件名,但所有内容都相同
- php - 页面 mim 类型 png - 上传/打开对话框加载 php/文本文件
- ubuntu - 如何在 ROS 凉亭中加载 kuka iiwa R820?
- swift - 使用 Swift 取消选择任务控制上的窗口
- python - 如何使用 Miniconda 创建纯 Python 虚拟环境?
- laravel-blade - 使用刀片 (Livewire) 调用动态内容
- lua - 如何在 ROBLOX 中找到零件表面的 2D 区域?
- td-engine - 使用TDengine时如何知道表在哪个vnode?
- flutter - 为什么有时我不能在 dart 文件中使用术语,而在其他 dart 文件中我可以使用该术语?