【问题标题】:How to move data between multiple database's table while maintaining foreign-key relationships/referential integrity?如何在保持外键关系/参照完整性的同时在多个数据库的表之间移动数据?
【发布时间】:2010-02-03 18:59:43
【问题描述】:

我正在尝试找出将几个有价值的数据表从多个数据库移动/合并为一个的最佳方法。

我有一个类似于以下的架构:

CREATE TABLE Products(
    ProductID int IDENTITY(1,1) NOT NULL,
    Name varchar(250) NOT NULL,
    Description varchar(1000) NOT NULL,
    ImageID int NULL
)

CREATE TABLE Images (
    ImageID int IDENTITY(1,1) NOT NULL,
    ImageData image NOT NULL
)

使用产品的 ImageID 到图像的 ImageID 的外键。

那么,将这些表中包含的数据从多个源数据库移动到具有相同架构的一个目标数据库中的最佳方法是什么?我的主要问题是维护产品及其各自图像之间的链接。

【问题讨论】:

    标签: sql database foreign-keys


    【解决方案1】:

    在 SQL Server 中,您可以启用身份插入:

    SET IDENTITY_INSERT NewTable ON
    <insert queries here>
    SET IDENTITY_INSERT NewTable OFF
    

    启用身份插入后,您可以像任何其他列一样在身份列中插入值。这允许您只复制表,例如从链接服务器:

    insert into newdb.dbo.NewTable
    select *
    from oldserver.olddb.dbo.OldTable
    

    【讨论】:

    • 这是正确的,然后首先移动带有PK的表格,然后是FK表格
    • 如何解决与 ID 的冲突?我有多个源数据库。我想我唯一的选择是转向 GUID?
    • GUID 是多数据库合并最自然的解决方案。另一种选择是在 ID 前面加上服务器特定的编号。例如,1000000 + id 用于来自 server1 的图像,2000000 + id 用于 server2,依此类推。这假设每个服务器的图像数量有限制:)
    • 小心使用 GUID 上的 PK,确保默认使用 NEWSEQUENTIALID() 而不是 NEWID()...否则您将获得页面拆分,从而导致碎片
    【解决方案2】:

    我将数据放在临时表中(为每个表添加一个 newid 列)。我在要合并的表中临时添加了一个列,即 Oldid。我将数据插入到父表中,将当前的 oldid 放在 oldid 列中。我使用 oldid 列加入临时表以填充临时表中的 newid 列。现在我有了子表的新 FK id,并且可以使用它们插入。如果您有 SQL Server 2008,则可以使用 OUTPUT 子句将 old 和 newids 返回到临时表,然后从那里使用而不是 dding 列。我更喜欢将更改显式存储在临时表中,以解决转换中的问题。最后,如果您要从第三个数据库添加记录,或者完成后将其删除,则最后将值 inteh oldid 列清空。将暂存表保留大约一个月,以便更轻松地研究任何问题。

    【讨论】:

      【解决方案3】:

      在这种情况下,您可以移动图像,然后移动产品。这将确保产品所引用的任何图像都已经存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-05
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2016-05-31
        相关资源
        最近更新 更多