我需要在 3 个表中执行数十万条记录的批量插入。表格的简单分割如下:
TableA
--------
TableAID (PK)
TableBID (FK)
TableCID (FK)
Other Columns
TableB
--------
TableBID (PK)
Other Columns
TableC
--------
TableCID (PK)
Other Columns
当然,批量插入的问题在于它仅适用于一张表,因此 FK 成为一个问题。
我一直在寻找解决这个问题的方法,并根据我从各种来源收集的信息,使用 SEQUENCE column可能是最好的选择。我只是想确保我已经正确地将我读过的各种线程和帖子中的逻辑拼凑在一起。如果我的想法正确,请告诉我。
首先,将表格修改为如下所示:
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 中的已知记录数(第二次数据库调用)。
使用现在已知的序列号修改 A、B 和 C 的现有对象(它们是为镜像表而生成的模型)。
批量插入到 TableA。 (第三次数据库调用)
- 批量插入到TableB。 (第四次数据库调用)
- 批量插入到TableC。 (第五次数据库调用)
然后,当然,我们总是会加入序列。
我有三个问题:
我的基本逻辑正确吗?
在表 B 和 C 中,我是否需要从 PK 中删除聚集索引并将其放入序列中?
一旦从表 B 和表 C 请求序列号,它们是否会以某种方式在请求和批量插入之间锁定?我只需要确保在请求和插入之间,其他进程不会请求并使用相同的数字。
谢谢!
编辑:
在输入并发布此内容后,我一直在深入阅读 SEQUENCE文档。我想我一开始就误解了。 SEQUENCE 不是列类型。对于表中的实际列,我只使用 INT (或者可能是 BIGINT),具体取决于我期望拥有的记录数。实际的 SEQUENCE 对象是一个完全独立的实体,其工作是根据请求生成数值并跟踪哪些数值已生成。因此,如果我理解正确的话,我将生成两个 SEQUENCE 对象,一个与表 B 结合使用,另一个与表 C 结合使用。
这回答了我的第三个问题。
最佳答案
Do I have the basic logic correct?
是的。这里的另一种常见方法是将数据批量加载到临时表中,并在服务器端执行类似的操作。
从客户端,您可以使用sp_sequence_get_range请求序列值的范围。存储过程。
In Tables B and C, would I remove the clustered index from the PK
不,正如您后来所指出的,序列只是为您提供 PK 值。
关于c# - 跨多个相关表进行批量插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54949051/