SQL按照PK-FK关系递归地复制多个表中的行

本文关键字:复制 PK-FK 按照 关系 递归 SQL | 更新日期: 2023-09-27 18:27:22

我的任务是创建一个存储过程,以复制数据库中与给定ID相关的每一条数据。这些数据跨越数十个表。每个表可以具有数十个匹配的行。

示例:

表帐户
pk=帐户ID

表帐户设置
FK=帐户ID

表用户
PK=用户ID
FK=帐户ID

表用户内容
PK=用户内容ID
FK=用户ID

我想创建一个与AccountID相关联的所有内容的副本(它将遍历几乎每个表)。该副本将有一个新的AccountID和UserContentID,但将有相同的UserID。新数据需要在其各自的表中。:)很有趣,对吧?

以上只是一个样本,但我会为大约50或60张桌子做这件事。我已经研究过使用CTE,但对它们仍然有点模糊。这可能被证明是最好的方法。我的SQL技能是。。。。。。到目前为止,我已经用它工作了大约40个小时:)

如有任何建议或指示,我们将不胜感激。此外,如果可能或更好的话,我并不反对通过C#来做这件事。

提前感谢您提供的任何信息帮助。

SQL按照PK-FK关系递归地复制多个表中的行

解决这一问题的最简单方法是暴力方法:编写一个非常长的proc,单独处理每个表。这很容易出错,而且很难维护。但它的优点是不依赖于数据库或数据库元数据处于任何特别一致的状态。

如果你想要一些基于元数据的东西,事情会更有趣。你有三个挑战:

  1. 您需要以编程方式识别所有相关的表
  2. 您需要为所有50或60生成插入语句
  3. 您需要为那些距离Account表超过一两步的表捕获生成的ID,这样它们就可以在更多复制的记录中用作外键

我以前研究过这个问题,虽然我不能为你提供一个严密的算法,但我可以给你一个通用的启发式算法。换句话说:这就是我的做法。

  1. 使用更高版本的MS实体框架(您说过您对使用C#持开放态度),构建Account表和所有相关表的模型
  2. 仔细检查一下。如果你的数据库和许多数据库一样,那么无论出于何种原因,你的应用程序所假设的一些关系都不会在数据库中设置实际的外键关系。无论如何都要在模型中创建它们
  3. 用C#编写一个小的递归例程,它可以接受一个Account对象并遍历所有相关的表。选择几个Account实例,让它将表名和密钥信息转储到一个文件中。检查其完整性和合理性
  4. 一旦你感到满意,你就有了一个好的模型和一个能处理所有问题的好算法,是时候开始破解代码了。你需要编写一个更复杂的算法,可以读取一个帐户并递归地克隆引用它的所有记录。你可能需要反思才能做到这一点,但这并不难:你需要的所有元数据都会在那里,在某个地方
  5. 测试您的代码。留出充足的时间进行调试
  6. 使用步骤3中的第一个算法来比较结果的完整性和准确性

EF方法的优点是:随着数据库的变化,你的模型也会发生变化,如果你的代码是基于元数据的,它应该能够适应。

缺点是:如果你有这样的现象,比如字段"实际上"是相同的,但类型不同,或者复杂的三元关系没有正确建模,或者嵌入了需要解析的CSV列表,这是行不通的。只有当数据库处于良好状态并且建模良好时,它才有效。否则你将需要诉诸暴力。