批量插入具有未知自动递增id的相关数据集
本文关键字:id 数据集 插入 未知 | 更新日期: 2023-09-27 18:10:39
我们正在将数据库主键从guid转换为自动递增的int。我们有从文本文件中解析的数据,并放入两个c#数据表Claim
和ClaimCharge
中,我们一直使用它们将数据批量插入到数据库中同名的表中。在数据库中,ClaimCharge.ClaimID
是Claim.ID
的外键,一个索赔存在多个索赔费用。
使用guid,我们在c#中生成Claim
和ClaimCharge
id,因此批量插入没有问题。但是对于int,我不知道Claim.ID
是什么,所以我不能赋值ClaimCharge.ClaimID
。我需要一些关于如何用int来实现这一点的想法。
例如,如果可以手动锁定Claim
表以防止插入,我可以:
- 批量插入到名为
ClaimBulkData
ClaimChargeBulkData
的备用表中。这些表仍然会使用guid,以方便维护c#和SQL之间的关系。 - 手动锁定
Claim
表对插入(不知道这是否可能),并获得最大(ID)。 - 使用MAX(ID)增加
ClaimBulkData
中的所有数据。 - 使用新更新的INT 将
- 使用
IDENTITY_INSERT ON
将数据作为一个集合插入到真实的Claim
表中,使用在第2步中创建的假想锁的某种异常。 - 释放针对
Claim
表上插入的手动创建的锁(再次,我不知道这是否可能。 - 插入
ClaimCharge
表
ClaimChargeBulkData
关联到ClaimBulkData
我想避免在c#或T-SQL中一次插入一行数据。
为什么不直接将新的自动增量列添加到主表中呢?这样您将同时拥有GUID和autoid列,这样您就可以修复外键关系(一次一个主表)
。
假设您有master1和detail1和detail1
alter table Master1 add ID int identity(1,1) not null
GO
alter Detail1 add master1ID int null
GO
alter Detail2 add master1ID int null
GO
然后根据oldguid键连接Master1更新Detail1和Detail12,为每个表设置Master1ID的相应值
然后可以根据Master1ID向Detail和Detail2添加外键
在这一点上,你应该有一个完整的数据集基于这两组键,你可以测试更新视图等,以确保他们与新的整数id 工作最后,当一切就绪后,删除不需要的GUID外键和GUID列。
如果您的意图是通过这种重组来减少总体磁盘使用,那么在您将所有内容清理并转换后,您总是可以运行数据库包。关键是在这样的过程中,大部分工作是修复外键。