sql - 如何将记录从互连表复制到不同数据库中的另一个表?

标签 sql sql-server database sql-server-2008 tsql

我有 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被生产。

可能的解决方案

  1. 重用旧的 First.FirstID 我想到的解决方案之一是重用数据库 A 中的旧的 First.FirstID。这可以通过设置 SET IDENTITY_INSERT 来完成TableName ON 就在 insert into TableName 之前并将 TableName.TableNameID 包含到插入语句中。但是,我的同事建议我不要这样做。

  2. 用新的 First.FirstID 覆盖 Second.FirstID,随后用新的 Second.SecondID 覆盖 Third.SecondID 我正在尝试使用 OUTPUT 应用此解决方案> 和 TABLE 变量,方法是将所有 First.FirstID 输出到一个临时表变量中,并将它们与表 Second similar to this answer 相关联但是,我坚持如何将 Second.FirstIDs 与临时表中的正确 ID 关联和替换。关于如何执行此操作的答案也将被接受为该问题的答案

  3. 使用解决方案 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/

相关文章:

database - 从 SQL 中检索 VB 中的数据

sql - 将主键更改为新的 id 列

mysql - 如何获取 SELECTed 输出并将其写入 MySQL 中的新表?

php - #1215 - 无法添加外键约束

php - 使用 FULLTEXT mysql 索引自动完成查询

c# - 按多列汇总数据

mysql - 这个查询可以写在 MS SQL 服务器上吗?该查询适用于 MySQL,但在 MS SQL Server 上未提供所需的输出

mysql - 如何将表名连接到行值以重命名列

sql-server - SQL Azure V12 BACPAC 导入错误 : "The internal target platform type SqlAzureV12DatabaseSchemaProvider does not support schema file version ' 3. 3'"

MYSQL查询不同表相同ID