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

Posted

技术标签:

【中文标题】如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)【英文标题】:How to move data from one table to another and update foreign keys (T-SQL 2008) 【发布时间】:2017-07-03 16:08:31 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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;

【讨论】:

嗨。是否允许执行“UPDATE updateableCTE SET OldValue=NewValue;”它更新了什么? updateableCTE 不是临时表吗? @AlexanderBartash,不,CTE 经常被误认为 临时表,但它只是 ad-hoc sql。只要这是明确的,它将根据自己的结果集进行更新。试试这段代码... 谢谢@Shnugo 这个功能的文档似乎很差,因为我检查了transact-sql 和 postrgesql 的文档,但没有任何相关内容。您是否有任何相关文件?我很感兴趣它是如何在幕后工作的。 @AlexanderBartash,你可以阅读this。没有文档,但有一些背景。 我已经在 Postgres 中尝试过,但它不允许我更新 CTE。所以它可能只适用于特定的数据库。

以上是关于如何将数据从一个表移动到另一个表并更新外键 (T-SQL 2008)的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将数据从一个表移动到另一个表并删除数据来自的列?

将数据从一个表更新到另一个表并在新的 ms 访问 .net 时插入

SQL中如何遍历表并更新某个字段的值

创建触发器以将数据从一个表获取到另一个表并生成时间戳

使用返回值更新列

如何将行从一个 Excel 工作表复制到另一个工作表并使用 VBA 创建重复项?