如何将代理键添加到相关表?
Posted
技术标签:
【中文标题】如何将代理键添加到相关表?【英文标题】:How to add surrogate key to related tables? 【发布时间】:2010-10-14 17:13:03 【问题描述】:我需要为我的数据仓库中的三个表添加一个 auto-inc 代理键:
注意:这些不是真实的表名
JakMaster (JakMasterId, Date) (PK) 注意:JakMasterId 是 varchar(60)
JakToRoad (JakMasterId, 日期) (FK)
JakToBig (JakMasterId, 日期) (FK)
我应该采取哪些步骤来为这三个表添加代理键,以便新键正确地相互引用?
谢谢!
【问题讨论】:
【参考方案1】:我假设您希望将 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
【讨论】:
你的假设是正确的。我会试一试,然后告诉你。【参考方案2】:您可以在数据库中分三个步骤执行此操作以创建代理 PK
更改表以创建代理键列。除了,它必须可以为空。
编写一个小程序来设置键值。这是一个循环进行更新。
更改表以使代理键列非空、自增、索引、唯一等。
现在您需要创建 FK。
更改表格以添加 FK 列。同样,它必须可以为空。
编写一个小程序设置FK列。这是一个 SELECT(根据非代理键获取 PK 行),以及对引用表的 UPDATE。
如有必要,更改表以使 FK 不为空。这并不总是必要的,它取决于 FK 表与 PK 表关系的定义。
为所有其他表重复 FK 创建。
【讨论】:
@S. Lott:对于(第一步)第 2 步,为什么我不能让数据库只生成值? @subt13:会吗?大多数没有。但如果你这样做,那就让它吧。 @S. Lott:我的意思是,当我添加代理键时,我可以同时将它设置为 auto-inc 列。然后,当保存表时,会生成值。以上是关于如何将代理键添加到相关表?的主要内容,如果未能解决你的问题,请参考以下文章