【问题标题】:Copying a 1-to-many relationship between two tables to another two tables (SQL 2005)将两个表之间的一对多关系复制到另外两个表 (SQL 2005)
【发布时间】:2011-04-27 14:26:52
【问题描述】:

我有两个具有父子关系的表。我想将他们的一些记录复制到另外两个表中,也具有父子关系,但表结构略有不同。

两组表都有一个外键,一个整数列。所有表的主键列都有标识增量。

如果我从源父表到目标父表做SELECT INTO,目标记录的主键值将与源记录不同,父子关系将丢失。

鉴于我将在新的父表中拥有新的主键值,有谁知道我如何在复制期间保持这种关系?我不希望在此复制过程中为新表设置标识增量,因为不能保证源表中的主键值不会已经在目标中。

希望我的描述有意义,并感谢您的意见。如果我可以进一步澄清,请告诉我。

【问题讨论】:

    标签: sql-server-2005 parent-child select-into


    【解决方案1】:

    完成此操作后,我通过在插入新表后保留旧 ID 来做到这一点。

    有些人使用旧 ID 添加临时列,但我知道更好的方法。

    您可以使用the OUTPUT clause将插入的记录插入到临时表中(以新旧ID作为映射表。然后在插入子记录时加入。

    这样的东西(粗制滥造)

    DECLARE @MyTableVar TABLE (
        NewID INT,
        OldID INT
    )
    
    INSERT NewParentTable
    OUTPUT
        INSERTED.ID,
        old.ID
    INTO @MyTableVar
    SELECT *
    FROM OldParentTable old
    
    
    INSERT NewChildTable
    SELECT
        old.ID,
        t.NewID,
        old.name
    FROM OldChildTable old
    INNER JOIN @MyTableVar t ON t.OldID = old.ParentID
    

    【讨论】:

    • 谢谢。听起来很有希望
    • 奇怪,我在 OUTPUT 语句中遇到错误,关于“找不到多部分标识符 old.ID”。在我对 OUTPUT 所做的所有阅读中,没有一个示例没有在输出列前面加上 INSERTED 或 DELETED。我可以在 OUTPUT 中使用表名作为前缀吗?
    • 我刚查了一下,好像the OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.
    • 我也看到了同样的事情。有一个讨论这个问题的线程:stackoverflow.com/questions/155321/… 还有,这是 MSDN 中对这个问题的精彩讨论:social.msdn.microsoft.com/forums/en-US/transactsql/thread/…
    • Jamie Thomson 说他可以通过 Merge 语句来做到这一点。我想知道他是否在谈论同样的事情。我这里没有 2008 DB 可以玩,否则我会尝试一些东西。
    【解决方案2】:

    您必须将原始 ID 与相应的 parentID 保存在表中的单独列中。 因此,在您的目标表中,您需要添加一个 parentID_orig 列(不是自动编号)来保留链接。

    【讨论】:

    • 感谢您的提示,起初我正在考虑这些方面的事情。如果加布里埃尔的想法不成功,我会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多