如何在保持外键关系/参照完整性的同时在多个数据库表之间移动数据?

时间:2010-02-03 18:59:44

标签: sql database foreign-keys

我正在试图找出将多个数据库中的几个数据表移动/合并为一个的最佳方法。

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

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
)

使用Products的ImageID的外键到图像的ImageID。

那么将这些表中包含的数据从多个源数据库移动到具有相同模式的一个目标数据库的最佳方法是什么。我的主要问题是维护产品与各自图像之间的联系。

3 个答案:

答案 0 :(得分:3)

在SQL Server中,您可以启用标识插入:

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

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

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

答案 1 :(得分:1)

我在临时表中预置数据(为每个表添加一个newid列)。我暂时在我正在合并的表中添加一列,即Oldid。我将数据插入到父表中,将当前oldid放在oldid列中。我使用oldid列连接到登台表以填充登台表中的newid列。现在我有子表的新FK ID和使用它们的ccan插入。如果您有SQL Server 2008,则可以使用OUTPUT子句将old和newids返回到临时表,然后从那里使用而不是对列进行调整。我更喜欢将更改显式存储在临时表中,以解决转换中的问题。如果您要添加第三个数据库中的记录,或者如果您已完成,则将其删除,最后将inth oldid列作为值。将登台表保留一个月左右,以便更轻松地研究任何问题。

答案 2 :(得分:0)

在这种情况下,您可以移动图像,然后移动产品。这将确保产品具有参考的任何图像已经存在。