如何将代理键添加到相关表中?

时间:2010-10-14 17:13:04

标签: sql sql-server sql-server-2008-r2

我需要在我的数据仓库中的三个表中添加一个auto-inc代理键:

注意:这些不是真正的表名

  

JakMaster(JakMasterId,Date)(PK)注意:JakMasterId是varchar(60)

     

JakToRoad(JakMasterId,Date)(FK)

     

JakToBig(JakMasterId,Date)(FK)

我应该采取哪些步骤为这三个表添加代理键,以便新键正确引用?

谢谢!

2 个答案:

答案 0 :(得分:3)

我假设您想要将JakMasterId替换为自动增量字段,因此其他两个表不需要varchar(60)字段并​​且可以改善查询时间,但是您将JakMasterId保留为信息。 / p>

-- set database single-user

-- drop foreign keys

create table NewMaster (ID int identity(1, 1), JakMasterId, Date))
insert NewMaster(JakMasterId, Date) select JakMasterId, Date from JakMaster
drop table JakMaster
sp_rename 'NewMaster', 'JakMaster'

alter table JakToRoad add MasterId int
alter table JakToBig add MasterId int

update JakToRoad set MasterId = JakMaster.ID
from JakToRoad
inner join JakMaster on JakMaster.JakMasterId = JakToRoad.JakMasterId

update JakToBig set MasterId = JakMaster.ID
from JakToBig 
inner join JakMaster on JakMaster.JakMasterId = JakToBig .JakMasterId

alter table JakToRoad drop column JakMasterId
alter table JakToBig drop column JakMasterId


alter table JakToRoad add constraint FK_JTRtoJM foreign key (MasterId) references JakMaster (ID)
alter table JakToBig add constraint FK_JTBtoJM foreign key (MasterId) references JakMaster (ID)

-- reset database to multi-user

答案 1 :(得分:1)

您可以在DB中的三个步骤中执行此操作以创建代理PK

  1. 更改表格以创建代理键列。除此之外,它必须是可以为空的。

  2. 编写一个小程序来设置键值。这是一个做UPDATE的循环。

  3. 更改表格,使代理键列非空,自动增量,索引,唯一等。

  4. 现在你需要创建FK。

    1. 更改表格以添加FK列。同样,它必须是可以为空的。

    2. 编写一个小程序来设置FK列。这是一个SELECT(基于非代理键获取PK行),以及引用表的UPDATE。

    3. 如有必要,请更改表以使FK非空。这并不总是必要的,它取决于FK表与PK表的关系的定义。

    4. 为所有其他表重复FK创建。