我们正在将数据库主键从GUID转换为自动递增的INT。我们从文本文件中解析数据并将其放入两个C#DataTables 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)。ClaimBulkData
中的所有数据。ClaimChargeBulkData
与ClaimBulkData
相关联
Claim
将数据作为集合插入到真实IDENTITY_INSERT ON
表中,使用某种异常来处理步骤2中创建的虚拟锁。Claim
表格上的插页(我再也不知道这是否可行。ClaimCharge
表。我想避免在C#或T-SQL中一次插入一行数据。
答案 0 :(得分:1)
为什么不将新的自动增量列添加到主表中 - 然后您将同时拥有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列本身。
如果您的目的是通过此重组减少整体磁盘使用量,那么一旦清理完所有内容,您就可以运行数据库包。重点是在这样的过程中修改外键的工作。