2010-10-14 26 views
4

我需要一个自动INC代理键在我的数据仓库添加到三个表:如何将代理键添加到相关表中?

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

JakMaster(JakMasterId,日期)(PK)注:JakMasterId为varchar(60)

JakToRoad(JakMasterId,日期)(FK)

JakToBig(JakMasterId,日期)(FK)

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

谢谢!

回答

3

我假设你想用自动增量字段替换JakMasterId,所以其他两个表不需要varchar(60)字段并​​改善查询时间,但是你要保留JakMasterId作为信息。

-- 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 
+0

你的假设是正确的。我会试试这个,让你知道。 – 2010-10-14 21:19:13

1

您可能能够做到这一点在数据库中的三个步骤来创建代理PK

  1. 更改表创建代理键列。除了它必须是可空的。

  2. 编写一个小程序来设置关键值。这是一个循环进行更新。

  3. 改变表,使代理键列非空,自动递增,索引,独特,等

现在,您需要创建FK的。

  1. 改变表格以添加FK列。再次,它必须是可空的。

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

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

对所有其他表重复FK创建。

+0

@S。洛特:对于(第一)步骤2,为什么我不能让数据库生成值? – 2010-10-14 17:36:36

+0

@ subt13:会吗?大多数不。但是,如果你的确如此,那就放手吧。 – 2010-10-14 17:37:32

+0

@S。 Lott:我的意思是,当我添加代理键时,我可以同时将它设置为auto-inc列。然后,在保存表格时,会生成值。 – 2010-10-14 17:39:19

相关问题