如何将数据从一个表移动到另一个表并更新外键(T-SQL 2008)

时间:2017-07-03 16:08:32

标签: sql-server sql-server-2008 tsql

我有两个存储文件内容的表Blob和FileContents。 两个表具有相同的结构:Id int IDENTITY(1,1),Content varbinary(max)NULL, 两个表都有数据。

我有几个其他表有这些表的外键。 例如,表MxdFiles具有字段BlobId,它是Blobs表的Id字段的外键。

现在我需要将所有记录从Blob移动到FileContents并使用新ID更新MxdFiles表

请告知如何实现这一目标或提供任何阅读链接。

1 个答案:

答案 0 :(得分:1)

尝试这样的事情:

CREATE DATABASE TestDB
GO
USE TestDB;
GO
CREATE TABLE t1(ID INT IDENTITY PRIMARY KEY,SomeContent VARCHAR(100));
CREATE TABLE t2(ID INT IDENTITY PRIMARY KEY,SomeContent VARCHAR(100));

INSERT INTO t1 VALUES('Test1a'),('Test1b');
INSERT INTO t2 VALUES('Test2a'),('Test2b');

CREATE TABLE Referenced(ID INT IDENTITY, t1_ID INT CONSTRAINT fkTest FOREIGN KEY REFERENCES t1(ID));

INSERT INTO Referenced VALUES(1),(2); --Now both entries in t1 are referenced

- 想要将所有条目从t1转移到t2:

ALTER TABLE t2 ADD OldID INT;
INSERT INTO t2
SELECT t1.SomeContent,t1.ID FROM t1;

SELECT * FROM t2;

- 结果:导入的行有OldID

ID  SomeContent OldID
1   Test2a      NULL
2   Test2b      NULL
3   Test1a      1
4   Test1b      2

- 切换值:

--Drop the constraint
ALTER TABLE Referenced DROP CONSTRAINT fkTest;
--Switch the references
WITH updateableCTE aS
(
    SELECT r.t1_ID AS OldValue
          ,t2.ID AS NewValue
    FROM Referenced AS r
    INNER JOIN t2 ON r.t1_ID=t2.OldId
)
UPDATE updateableCTE SET OldValue=NewValue;
--Re-create the FK
ALTER TABLE Referenced ADD CONSTRAINT fkTest FOREIGN KEY (t1_ID) REFERENCES t2(ID); 

SELECT * FROM Referenced;

GO
USE master;
GO
DROP DATABASE TestDB;