C# 跨多个相关表大容量插入?

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成了一个问题 我一直在寻找解决这个问题的方法,从我从各种来

我需要在3个表中大量插入数十万条记录。这些表格的简单分类如下:

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。(第五次数据库呼叫)
然后,当然,我们总是加入到序列中

我有三个问题:

  • 我的基本逻辑正确吗

  • 在表B和表C中,我是否会从PK中删除聚集索引并将其放入序列中

  • 一旦从表B和表C请求序列号,它们是否会以某种方式锁定在请求和批量插入之间?我只需要确保在请求和插入之间,其他进程不会请求并使用相同的数字

  • 谢谢

    编辑:

    在输入并发布之后,我一直在深入阅读文档。我想我一开始误解了。序列不是列类型。对于表中的实际列,我只使用INT(或者可能是BIGINT),这取决于我期望的记录数)。实际的序列对象是一个完全独立的实体,其任务是根据请求生成数值,并跟踪已经生成的数值。因此,如果我理解正确,我将生成两个序列对象,一个与表B结合使用,另一个与表C结合使用

    这就回答了我的第三个问题

    我的基本逻辑正确吗

    对。这里的另一种常见方法是将数据批量加载到暂存表中,并在服务器端执行类似的操作

    您可以使用存储过程从客户端请求序列值的范围

    在表B和C中,我会从PK中删除聚集索引吗


    不,正如您后来指出的,该序列仅为您提供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非常类似)