SQL 使用新的外键复制数据

Posted

技术标签:

【中文标题】SQL 使用新的外键复制数据【英文标题】:SQL copying data with new foreign keys 【发布时间】:2021-07-20 13:21:13 【问题描述】:

我有一个非常棘手的问题。 我有两张桌子。一个通过外键依赖于另一个。 表一

Table1ID Instance ID ModifiedBy
1 1 yevhen
2 1 yevhen
3 1 yevhen

表 2

ID Instance ID Table1ID
1 1 1
2 1 2
3 1 3

这些被视为名为“场景”的数据集。 当有人创建新场景时,它会触发两个存储过程 - 一个用于 Table1,另一个用于 Table2,它们基本上使用新的实例 ID 在同一个表中复制这些数据。这就是我们遇到问题的地方。 Table1 将自动增加它的键,但 Table2 将保留旧外键,用于像这样的新实例

表 1

Table1ID Instance ID ModifiedBy
1 1 yevhen
2 1 yevhen
3 1 yevhen
4 2 yevhen
5 2 yevhen
6 2 yevhen

表 2

ID Instance ID Table1ID
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3

如何使用 Table1 中的新 ID 设置 Table1ID?

【问题讨论】:

请edit您的问题并添加您的代码 【参考方案1】:

你说你有两个存储过程。但是对于像这样的同步逻辑,您可能应该在同一个存储过程中执行此操作。

在该过程中,当插入表 1 时,使用 output 捕获那些新插入的记录。这些结果将为您提供插入的主键,然后您将其泵入表 2。

create table #newRecords (table1id int, [instance id] int);

insert      table1
output      inserted.Table1ID, inserted.[Instance ID] into #newRecords
select      [instance id], modifiedBy 
from        table1;

insert      table2
select      nr.[instance id], nr.table1id
from        #newRecords nr;

您的表 2 结果如下:

ID Instance ID Table1ID
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
6 1 6

【讨论】:

好吧,我们有超过 2 张桌子。基本上有 5 个不同的表依赖于那个表,并且所有表都包含自己的信息。它们之间唯一的相似之处是它们都有 InstanceID 和 Table1ID 列。所以我想把所有的都放在一个 SP 上不是一种选择 没有什么可以阻止您合并两个以上的存储过程。但可能存在设计问题。您可能想为您的示例提供更多信息,以说明您为什么觉得无法合并 procs。 不,实际上你是对的。我可以将它们全部合并到一个 sp 中。只需要弄清楚如何正确地做到这一点并在我的脑海中整理出你的解决方案:D

以上是关于SQL 使用新的外键复制数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在sqlyog设置表的外键

SQL 2005 另一个基础之间的外键

sql数据建模器中的外键问题

sql。两个间的外键约束和插入数据问题

如何在sql中使用2个以上的外键显示数据?

mysql数据库怎么删除一个表的外键