我发现的另一种方法是使用ROW_NUMBER 函数任意连接表,然后使用该派生查询来更新 FK。我们的想法是tableA 和 tableB之间还没有关系,我们只需要链接它们来获取新的外键。将它们加入到 ROW_NUMBER 之类的任意对象上,我们可以从中挑选出一行来获取 Id。
首先创建新记录
INSERT INTO TableB VALUES (value1)
在 ROW_NUMBER 上编写任意连接它们的查询(我们在下一步中使用它)
SELECT
tableARows.Id,
tableBRows.TheNewId
FROM
(
SELECT Id, Row = ROW_NUMBER() OVER (ORDER BY Id) FROM tableA
)tableARows INNER JOIN
(
SELECT TheNewId, Row = ROW_NUMBER() OVER (ORDER BY TheNewId) FROM tableB
)tableBRows ON tableARows.Row = tableBRows.Row
然后是一个完整的 UPDATE 语句,用来自 tableB 的新 FK 填充 tableA
UPDATE tableA
SET tableA.ForeignKey = LinkedKeys.TheNewId
FROM
(
SELECT
tableARows.Id,
tableBRows.TheNewId
FROM
(
SELECT Id, Row = ROW_NUMBER() OVER (ORDER BY Id) FROM tableA
)tableARows INNER JOIN
(
SELECT TheNewId, Row = ROW_NUMBER() OVER (ORDER BY TheNewId) FROM tableB
)tableBRows ON tableARows.Row = tableBRows.Row
)LinkedKeys INNER JOIN
tableA ON tableA.Id = LinkedKeys.Id
这是我使用的示例表定义。
CREATE TABLE tableA (Id INT, ForeignKey INT)
INSERT INTO tableA VALUES (100,NULL),(200,NULL),(300,NULL)
CREATE TABLE tableB (TheNewId INT)
INSERT INTO tableB VALUES(5000),(6000),(7000)