我有 3 个相互关联的表。表格设计如下。
- 第一个(PK:FirstID, vchar:Name, int:Year)
- 第二个(PK:SecondID, FK:FirstID, int:Day, int:Month)
- 第三(PK:ThirdID, FK:SecondID, int:Speed, vchar:Remark)
我正在尝试将 3 个相互关联的表中的记录从数据库 A 复制到数据库 B。所以我的 Transact-SQL 看起来像这样:
INSERT INTO First
(Name, Year)
SELECT Name, Year
FROM DB_A.dbo.First
WHERE Year >= 1992
INSERT INTO Second
(FirstID, Day, Month)
SELECT FirstID, Day, Month
FROM DB_A.dbo.Second S INNER JOIN
DB_A.dbo.First F ON S.FirstID = F.FirstID
WHERE Month > 6
INSERT INTO Third
(SecondID, Speed, Remark)
SELECT SecondID, Speed, Remark
FROM DB_A.dbo.Third T INNER JOIN
DB_A.dbo.Second S ON T.SecondID = S.SecondID INNER JOIN
DB_A.dbo.First F ON F.FirstID = S.FirstID
WHERE Remark <> NULL
这些语句一直运行良好,直到数据库A和B中的First.FirstID的起始位置变得不一样,因为数据库B中的三个表都是空的。因此,the constraint on foreign_key error被生产。
可能的解决方案
重用旧的 First.FirstID 我想到的解决方案之一是重用数据库 A 中的旧的 First.FirstID。这可以通过设置
SET IDENTITY_INSERT 来完成TableName ON
就在insert into TableName
之前并将TableName.TableNameID
包含到插入语句中。但是,我的同事建议我不要这样做。用新的 First.FirstID 覆盖 Second.FirstID,随后用新的 Second.SecondID 覆盖 Third.SecondID 我正在尝试使用
OUTPUT
应用此解决方案> 和TABLE
变量,方法是将所有 First.FirstID 输出到一个临时表变量中,并将它们与表 Second similar to this answer 相关联但是,我坚持如何将 Second.FirstIDs 与临时表中的正确 ID 关联和替换。关于如何执行此操作的答案也将被接受为该问题的答案。使用解决方案 1 并使用
UPDATE CASCADE
更新主键和外键。我刚刚有了这个想法,但我觉得它会非常乏味。需要做更多的研究,但如果有一个答案可以说明如何成功实现这一点,那么我会接受这个答案。
那么如何将记录从 3 个相互链接的表复制到另外 3 个相似但主键不同的表?有没有比上面提出的更好的解决方案?
最佳答案
您可以使用 OUTPUT Clause .
CREATE TABLE #First (NewId INT PRIMARY KEY, OldId INT)
INSERT INTO First
(
Name,
Year,
OldId -- Added new column
)
OUTPUT Inserted.FirstID, Inserted.OldId INTO #First
SELECT
Name,
Year,
FirstID -- Old Id to OldId Column
FROM
DB_A.dbo.First
WHERE
Year >= 1992
第二张表
CREATE TABLE #Second (NewId INT PRIMARY KEY, OldId INT)
INSERT INTO Second
(
FirstID,
Day,
Month,
OldId -- Added new column
)
OUTPUT Inserted.SecondID, Inserted.OldId INTO #Second
SELECT
OF.NewId, --FirstID
Day,
Month,
SecondID
FROM
DB_A.dbo.Second S INNER JOIN
DB_A.dbo.First F ON S.FirstID = F.FirstID INNER JOIN
#First OF ON F.FirstId = OF.OldId -- Old ids here
WHERE
Month > 6
最后一个
INSERT INTO Third
(
SecondID,
Speed,
Remark
)
SELECT
OS.NewId, -- SecondID
Speed,
Remark
FROM
DB_A.dbo.Third T INNER JOIN
DB_A.dbo.Second S ON T.SecondID = S.SecondID INNER JOIN
DB_A.dbo.First F ON F.FirstID = S.FirstID INNER JOIN
#Second OS ON S.SecondID = OS.OldId
WHERE Remark <> NULL
关于sql - 如何将记录从互连表复制到不同数据库中的另一个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38304359/