我需要在我的数据仓库中的三个表中添加一个auto-inc代理键:
注意:这些不是真正的表名
JakMaster(JakMasterId,Date)(PK)注意:JakMasterId是varchar(60)
JakToRoad(JakMasterId,Date)(FK)
JakToBig(JakMasterId,Date)(FK)
我应该采取哪些步骤为这三个表添加代理键,以便新键正确引用?
谢谢!
答案 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
更改表格以创建代理键列。除此之外,它必须是可以为空的。
编写一个小程序来设置键值。这是一个做UPDATE的循环。
更改表格,使代理键列非空,自动增量,索引,唯一等。
现在你需要创建FK。
更改表格以添加FK列。同样,它必须是可以为空的。
编写一个小程序来设置FK列。这是一个SELECT(基于非代理键获取PK行),以及引用表的UPDATE。
如有必要,请更改表以使FK非空。这并不总是必要的,它取决于FK表与PK表的关系的定义。
为所有其他表重复FK创建。