SQL 使用新的外键复制数据
SQL copying data with new foreign keys
我这里有一个非常棘手的问题。
我有两个 table。一个通过外键依赖于另一个。
Table 1
Table1ID
实例 ID
修改者
1
1
是的
2
1
是的
3
1
是的
Table 2
ID
实例 ID
Table1ID
1
1
1
2
1
2
3
1
3
这些被用作名为“场景”的东西的数据集。
当有人创建新场景时,它会触发两个存储过程 - 一个用于 Table1,另一个用于 Table2,它们基本上是在具有新实例 ID 的同一 table 中复制此数据。这就是我们遇到问题的地方。 Table1 将自动递增它的键,但 Table2 将保留新实例的旧外键,如下所示
Table 1
Table1ID
实例 ID
修改者
1
1
是的
2
1
是的
3
1
是的
4
2
是的
5
2
是的
6
2
是的
Table 2
ID
实例 ID
Table1ID
1
1
1
2
1
2
3
1
3
4
2
1
5
2
2
6
2
3
如何使用 Table1 中的新 ID 设置 Table1ID?
你说你有两个存储过程。但是对于这样的同步逻辑,您应该在同一个存储过程中进行。
在该过程中,当插入到table 1 时,使用output
捕获那些新插入的记录。这些结果将为您提供插入的主键,您又将其泵入 table 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;
您的 table 2 结果如下:
ID
Instance ID
Table1ID
1
1
1
2
1
2
3
1
3
4
1
4
5
1
5
6
1
6
我这里有一个非常棘手的问题。 我有两个 table。一个通过外键依赖于另一个。 Table 1
Table1ID | 实例 ID | 修改者 |
---|---|---|
1 | 1 | 是的 |
2 | 1 | 是的 |
3 | 1 | 是的 |
Table 2
ID | 实例 ID | Table1ID |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
这些被用作名为“场景”的东西的数据集。 当有人创建新场景时,它会触发两个存储过程 - 一个用于 Table1,另一个用于 Table2,它们基本上是在具有新实例 ID 的同一 table 中复制此数据。这就是我们遇到问题的地方。 Table1 将自动递增它的键,但 Table2 将保留新实例的旧外键,如下所示
Table 1
Table1ID | 实例 ID | 修改者 |
---|---|---|
1 | 1 | 是的 |
2 | 1 | 是的 |
3 | 1 | 是的 |
4 | 2 | 是的 |
5 | 2 | 是的 |
6 | 2 | 是的 |
Table 2
ID | 实例 ID | Table1ID |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 2 | 1 |
5 | 2 | 2 |
6 | 2 | 3 |
如何使用 Table1 中的新 ID 设置 Table1ID?
你说你有两个存储过程。但是对于这样的同步逻辑,您应该在同一个存储过程中进行。
在该过程中,当插入到table 1 时,使用output
捕获那些新插入的记录。这些结果将为您提供插入的主键,您又将其泵入 table 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;
您的 table 2 结果如下:
ID | Instance ID | Table1ID |
---|---|---|
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 3 |
4 | 1 | 4 |
5 | 1 | 5 |
6 | 1 | 6 |