【问题标题】: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)

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

谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008-r2


    【解决方案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

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

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

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

    现在您需要创建 FK。

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

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

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

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

    【讨论】:

    • @S. Lott:对于(第一步)第 2 步,为什么我不能让数据库只生成值?
    • @subt13:会吗?大多数没有。但如果你这样做,那就让它吧。
    • @S. Lott:我的意思是,当我添加代理键时,我可以同时将它设置为 auto-inc 列。然后,当保存表时,会生成值。
    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2016-08-10
    • 2021-08-15
    • 2012-09-09
    相关资源
    最近更新 更多