【问题标题】:Composite Primary Key + Foreign Key复合主键+外键
【发布时间】:2012-06-26 20:34:53
【问题描述】:

我有一个包含调查列表的表格(PK 是 ID)

CREATE TABLE [dbo].[SurveyMaster](
    [ID] [nvarchar](4) NOT NULL,
    [Title] [nvarchar](200) NULL,
    [IsActive] [bit] NOT NULL,

还有一个包含变量映射列表的表格。

CREATE TABLE [dbo].[VariableMappings](
    [ParentSurvey_ID] [nvarchar](4) NOT NULL,
    [ReportingMonth] [nvarchar](6) NOT NULL,
    [VariableName] [nvarchar](400) NOT NULL,
    [Value] [int] NOT NULL

我希望在 ParentSurvey_ID、ReportingMonth 和变量名称上为 VariableMappings 创建一个主键,以确保记录的唯一性。

不过,与此同时,我想要 VariableMappings.ParentSurvey_ID 和 SurveyMaster.ID 之间的外键关系,以确保 VariableMappings 仅包含相关的 SurveyID。

我在 SQL Server 中尝试了几种方法,但我不相信我可以创建 FK,因为复合键由 3 列组成。

我该如何实现这一目标?

【问题讨论】:

    标签: sql database sql-server-2008


    【解决方案1】:

    是的,您可以:

    CREATE TABLE [dbo].[VariableMappings](
        [ParentSurvey_ID] [nvarchar](4) NOT NULL,
        [ReportingMonth] [nvarchar](6) NOT NULL,
        [VariableName] [nvarchar](400) NOT NULL,
        [Value] [int] NOT NULL,
      PRIMARY KEY (ParentSurvey_ID, ReportingMonth, VariableName),
      FOREIGN KEY (ParentSurvey_ID)
        REFERENCES dbo.SurveyMaster (ID)
    ) ;
    

    大多数情况下与您的问题无关,但拥有如此宽(410 个 nvarchars)的 PRIMARY KEY 并不是最好的主意。

    【讨论】:

    • 非常感谢。我认为我遇到的问题是通过 SQL Server Management Studio 使用 GUI。我显然需要学习如何更好地手工完成这项工作,谢谢。
    【解决方案2】:

    您的主键定义和外键定义是正交的。您可以毫无问题地声明复合主键和单列外键。不过,我建议您,VariableMappings 上的代理主键是比复合键更好的选择 - 特别是对于指向 VariableMappings 的外键。

    【讨论】:

      【解决方案3】:

      有一个主键很重要,那就是SurveyMaster。只要ID 是那里的主键,您就可以从任意数量的其他表中引用它,而不管这些表的主键如何。

      外键要求列的引用组合是唯一的,并且必须保证唯一性,例如通过主键约束。

      【讨论】:

        猜你喜欢
        • 2018-04-07
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2022-11-21
        • 2017-08-06
        • 2016-07-04
        • 2021-10-03
        相关资源
        最近更新 更多