我需要向数据仓库中的三个表添加自动增量代理键:

笔记:这些不是真正的表名

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

其他提示

您也许可以在DB内部三个步骤进行此操作以创建替代PK

  1. 更改表以创建替代密钥列。除此之外,必须无效。

  2. 编写一个小程序来设置钥匙值。这是做更新的循环。

  3. 更改表以使替代密钥列非挂钩,自动插入,索引,唯一等。

现在您需要创建FK。

  1. 更改表以添加FK列。同样,它必须无效。

  2. 编写一个小程序以设置FK列。这是一个选择(以基于非流动键键获取PK行),并更新引用表。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top