C# 跨多个相关表大容量插入?
我需要在3个表中大量插入数十万条记录。这些表格的简单分类如下:C# 跨多个相关表大容量插入?,c#,asp.net,.net,sql-server,bulkinsert,C#,Asp.net,.net,Sql Server,Bulkinsert,我需要在3个表中大量插入数十万条记录。这些表格的简单分类如下: TableA -------- TableAID (PK) TableBID (FK) TableCID (FK) Other Columns TableB -------- TableBID (PK) Other Columns TableC -------- TableCID (PK) Other Columns 当然,大容量插入的问题是,它只适用于一个表,因此FK成了一个问题 我一直在寻找解决这个问题的方法,从我从各种来
TableA
--------
TableAID (PK)
TableBID (FK)
TableCID (FK)
Other Columns
TableB
--------
TableBID (PK)
Other Columns
TableC
--------
TableCID (PK)
Other Columns
当然,大容量插入的问题是,它只适用于一个表,因此FK成了一个问题
我一直在寻找解决这个问题的方法,从我从各种来源收集的信息来看,使用a可能是最好的选择。我只是想确保我已经正确地拼凑了我在这篇文章中读到的各种线索和帖子的逻辑。让我知道我的想法是否正确
首先,将修改表,使其如下所示:
TableA
--------
TableAID (PK)
TableBSequence
TableCSequence
Other Columns
TableB
--------
TableBID (PK)
TableBSequence
Other Columns
TableC
--------
TableCID (PK)
TableCSequence
Other Columns
然后,在应用程序代码中,我将使用以下逻辑对数据库进行五次调用:
- 从TableC请求X序列号,其中X是要插入TableC的已知记录数。(第一次数据库调用。)
- 从TableB请求Y序列号,其中Y是要插入TableB的已知记录数(第二次DB调用)
- 使用现在已知的序列号修改A、B和C的现有对象(这些对象是为镜像表而生成的模型)
- 批量插入表格A。(第三次数据库呼叫)
- 批量插入表B。(第四次数据库呼叫)
- 批量插入表C。(第五次数据库呼叫)
不,正如您后来指出的,该序列仅为您提供PK值。对不起,请先将您的问题看错。我现在看到,您正在尝试生成自己的PK,而不是让MS SQL为您生成它们。请记住我的上述评论
正如大卫·布朗(David Browne)所提到的,您可能希望使用一个暂存表,以避免给应用程序堆带来压力。使用tempdb并对每个表使用单个事务直接对表进行修改。然后,将暂存表复制到其目标上,或者在追加时使用合并。如果要强制执行FK,如果选择以相反顺序插入(C=>B=>A),则可以临时删除这些约束。如果在插入期间遇到性能问题,还可能考虑暂时删除索引。最后,考虑使用SSIS代替自定义应用程序。不能完全确定为什么要使用序列。听起来您需要的是表C中自动生成的PK(AI),以便插入表B,然后是表B中的AI,以便插入表A。如果您试图使用序列预测每个表的AI,请不要这样做。有更好的方法来预测下一个人工智能。但是,如果存在事务性故障、冲突等,即使这些也可能是错误的。此外,不能100%确定批量插入是否适合您的解决方案。你能提供更多关于你插入的数据来源的背景信息吗。。。非常感谢。是的,在你发表评论之前,我刚刚找到了
sp\u sequence\u get\u range
的文档。你能帮我一个忙,让我了解一下使用临时表的过程是如何工作的吗?我最关心的是让PK和FK在三个表之间匹配,这取决于源数据的外观,以及TableB和TableC是否有任何唯一的列。如果他们这样做了,你可以加载他们,然后当你加载TableA时,根据匹配的唯一列查找PK。B和C中的数据很简单。没有唯一的列。但我还是不明白这里的大局。告诉我我是否有这个权利。。。。我在DB中有3个表,它们镜像了A、B和C。让我们称它们为TempA、TempB和TempC。从代码中,我将三个模型原始转储到临时表中。所以现在TempA、TempB和TempC充满了数据,但它们之间没有任何关联。到目前为止我有这个权利吗?然后。。。我该从这里走到哪里?(在NoSQL表中,这将非常容易,我可以在其中存储JSON blob!)如果需要,您可以在SQL Server中存储JSON blob。实际上更像是一个数据建模决策。拆分表可以实现规范化(每段数据只存储一次),并提供引用完整性。好的,谢谢。我很确定我都遵守了。但我也得说,这听起来比我在作品中概述的过程复杂得多(而且可能很昂贵)。不是吗?帮我理解我没有看到的东西。看起来大卫正在带领你完成临时工作表的部分。要点:使用tempdb创建3个staging表(与创建norm非常类似)