我需要一个自动INC代理键在我的数据仓库添加到三个表:如何将代理键添加到相关表中?
注意:这些都不是真正的表名
JakMaster(JakMasterId,日期)(PK)注:JakMasterId为varchar(60)
JakToRoad(JakMasterId,日期)(FK)
JakToBig(JakMasterId,日期)(FK)
我应该采取哪些步骤将代理键添加到这三个表中,以便新键彼此正确引用?
谢谢!
我需要一个自动INC代理键在我的数据仓库添加到三个表:如何将代理键添加到相关表中?
注意:这些都不是真正的表名
JakMaster(JakMasterId,日期)(PK)注:JakMasterId为varchar(60)
JakToRoad(JakMasterId,日期)(FK)
JakToBig(JakMasterId,日期)(FK)
我应该采取哪些步骤将代理键添加到这三个表中,以便新键彼此正确引用?
谢谢!
我假设你想用自动增量字段替换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
您可能能够做到这一点在数据库中的三个步骤来创建代理PK
更改表创建代理键列。除了它必须是可空的。
编写一个小程序来设置关键值。这是一个循环进行更新。
改变表,使代理键列非空,自动递增,索引,独特,等
现在,您需要创建FK的。
改变表格以添加FK列。再次,它必须是可空的。
编写一个小程序来设置FK列。这是一个SELECT(获取基于非代理键的PK行)以及对引用表的UPDATE。
如有必要,修改表格以使FK非空。这并不总是必要的,它取决于FK表与PK表的关系的定义。
对所有其他表重复FK创建。
@S。洛特:对于(第一)步骤2,为什么我不能让数据库生成值? – 2010-10-14 17:36:36
@ subt13:会吗?大多数不。但是,如果你的确如此,那就放手吧。 – 2010-10-14 17:37:32
@S。 Lott:我的意思是,当我添加代理键时,我可以同时将它设置为auto-inc列。然后,在保存表格时,会生成值。 – 2010-10-14 17:39:19
你的假设是正确的。我会试试这个,让你知道。 – 2010-10-14 21:19:13