批量插入具有未知自动递增id的相关数据集

本文关键字:id 数据集 插入 未知 | 更新日期: 2023-09-27 18:10:39

我们正在将数据库主键从guid转换为自动递增的int。我们有从文本文件中解析的数据,并放入两个c#数据表ClaimClaimCharge中,我们一直使用它们将数据批量插入到数据库中同名的表中。在数据库中,ClaimCharge.ClaimIDClaim.ID的外键,一个索赔存在多个索赔费用。

使用guid,我们在c#中生成ClaimClaimCharge id,因此批量插入没有问题。但是对于int,我不知道Claim.ID是什么,所以我不能赋值ClaimCharge.ClaimID。我需要一些关于如何用int来实现这一点的想法。

例如,如果可以手动锁定Claim表以防止插入,我可以:

  1. 批量插入到名为ClaimBulkData ClaimChargeBulkData的备用表中。这些表仍然会使用guid,以方便维护c#和SQL之间的关系。
  2. 手动锁定Claim表对插入(不知道这是否可能),并获得最大(ID)。
  3. 使用MAX(ID)增加ClaimBulkData中的所有数据。
  4. 使用新更新的INT
  5. ClaimChargeBulkData关联到ClaimBulkData
  6. 使用IDENTITY_INSERT ON将数据作为一个集合插入到真实的Claim表中,使用在第2步中创建的假想锁的某种异常。
  7. 释放针对Claim表上插入的手动创建的锁(再次,我不知道这是否可能。
  8. 插入ClaimCharge

我想避免在c#或T-SQL中一次插入一行数据。

批量插入具有未知自动递增id的相关数据集

为什么不直接将新的自动增量列添加到主表中呢?这样您将同时拥有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列。

如果您的意图是通过这种重组来减少总体磁盘使用,那么在您将所有内容清理并转换后,您总是可以运行数据库包。关键是在这样的过程中,大部分工作是修复外键。