2012-06-26 529 views
2

我有一個包含調查列表的表(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 

我希望是創造VariableMappings上ParentSurvey_ID,ReportingMonth和變量名中的主鍵,以確保一個唯一的記錄。

儘管如此,我想要獲取VariableMappings.ParentSurvey_ID和SurveyMaster.ID之間的外鍵關係,以確保VariableMappings只包含相關的SurveyID。

我已經嘗試了幾種SQL Server中的方法,但我不相信我可以創建FK,因爲組合鍵由3列組成。

我該如何去做到這一點?

回答

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)不是最好的主意。

+2

非常感謝。我認爲我遇到的問題是通過SQL Server Management Studio使用GUI。 我明顯需要學習如何更好地手工完成,謝謝。 – Tom

3

您的主鍵定義和外鍵定義是正交的。您可以聲明組合主鍵和單列外鍵,而不會出現問題。不過,我建議您在VariableMappings上使用代理主鍵,而不是複合鍵 - 專用於指向VariableMappings的外鍵。

3

有一個重要的關鍵是重要的,它是SurveyMaster。只要ID是主鍵,您可以從任意數量的其他表中引用它,而不管這些表的主鍵。

外鍵要求引用的列的組合是唯一的,並且必須保證唯一性,例如通過主鍵約束。