我有一张表,其中包含一份调查清单(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和Variable Name上为VariableMappings创建一个主键,以确保唯一的记录。
与此同时,我想在VariableMappings.ParentSurvey_ID和SurveyMaster.ID之间建立外键关系,以确保VariableMappings仅包含相关的SurveyID。
我在SQL Server中尝试了几种方法,但由于复合键由3列组成,我不相信我可以创建FK。
我怎样才能实现这个目标?
答案 0 :(得分:9)
是的,你可以:
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)
) ;
与你的问题大多无关,但是PRIMARY KEY
如此宽(410个nvarchars)并不是最好的主意。
答案 1 :(得分:3)
您的主键定义和外键定义是正交的。您可以毫无问题地声明复合主键和单列外键。不过,我建议你VariableMappings
上的代理主键是更好的选择而不是复合键 - 特别是对于指向VariableMappings
的外键。
答案 2 :(得分:3)
有一个重要的主键,它是SurveyMaster
的主键。只要ID
是主键,就可以从任意数量的其他表中引用它,而不管这些表的主键是什么。
外键要求引用的列组合是唯一的,并且必须保证唯一性,例如通过主键约束。