4

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

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

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

JakToRoad (JakMasterId, 日期) (FK)

JakToBig (JakMasterId, 日期) (FK)

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

谢谢!

4

2 回答 2

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
于 2010-10-14T20:15:57.720 回答
1

您可以在数据库中分三个步骤执行此操作以创建代理 PK

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

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

  3. 更改表以使代理键列非空、自动递增、索引、唯一等。

现在您需要创建 FK。

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

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

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

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

于 2010-10-14T17:16:22.487 回答