将列提取到新表中,同时为新表创建FK

时间:2013-10-25 09:13:40

标签: sql sql-server database entity-framework ef-migrations

我有一个现有的SQL Server数据库,其Customers表包含列:

Customers:  CustomerId (PK), A, B, C, D, E, F 

最后三列代表邮寄地址;我想将这些地址列提取到一个单独的地址表中,由FK链接,并同时迁移数据。所以我最终得到了:

Customers:  CustomerId (PK), A, B, C, AddressId (FK)

Addresses:  AddressId (PK), D, E, F

地址最终也会被许多其他表引用,因此它需要自己独立的AddressId,数据库生成 - 它不能与Customer共享相同的Id。地址也不能包含客户的FK - 模式必须如图所示。

我对SQL不太熟悉。在SQL中创建新的Addresses表,复制数据,然后从Customers中删除冗余列没有任何困难。但我不知道如何将数据库生成的AddressId作为FK返回到Customer中。我是否需要采用某种程序方法,例如游标 - 或者有没有办法在一个声明性SQL查询中完成整个迁移?感谢。

(N.B。我希望最终能够在Code First Migrations中做到这一点。)

1 个答案:

答案 0 :(得分:0)

我最终找到了答案。您必须使用Merge,才能将源表和目标表中的列输出到临时表中:

Declare @MyTableVar table(
 CustomerId int not null,
 AddressId int not null
);

Merge into dbo.Addresses    
using (select CustomerId, D,E,F from dbo.Customers) as addressDetails
on 1=0
when not matched then 
insert ( D,E,F) values ( Customers.D, Customers.E, Customers.F)
output addressDetails.CustomerId, inserted.AddressId into @MyTableVar;
update Customers  set AddressId =
 (Select AddressId from @MyTableVar where CustomerId = Customers.CustomerId );