SQL Server - 子表中的两列引用父表中的相同列

时间:2018-05-29 00:40:07

标签: sql-server foreign-keys ssms

正如标题所报告的那样,我有一个子表(Contracts),其中有两列,每列都引用父表(Clients)中的相同键列。

我做出这种设计选择的原因是父表包含客户端,但同时客户端可能是另一个客户的提供商公司。

我遇到的问题是:表是正确创建的,但是外键(仅与这两个表相关)似乎在子表(合同 - 它们应该保留的位置)和在客户端(不知道为什么他们也在这里显示)。当我打开SSMS关系设计器时,我可以看到这个副本,我在两个表中都看到了两个外键的存在。

下面是生成这个问题的代码(将出现此处未提及的其他表,因为它们不会产生问题): 表客户:

CREATE TABLE tblClients 
(
    VAT_Number NVARCHAR(30) NOT NULL PRIMARY KEY,
    Country_EID NVARCHAR(5) NOT NULL,
    User_EID NVARCHAR(50) NOT NULL,
    Is_Company_Group BIT NOT NULL,
    Recording_Date SMALLDATETIME NOT NULL 
        CONSTRAINT DF_tblClients_Recording_Date DEFAULT CONVERT(SMALLDATETIME, GETDATE()),
    General_Notes NVARCHAR(300),

    CONSTRAINT tblClients_Country_EID_FK 
        FOREIGN KEY (Country_EID) REFERENCES tblCountryLkp(Country_ID),

    CONSTRAINT tblClients_User_EID_FK 
        FOREIGN KEY (User_EID) REFERENCES tblUsers(User_ID)
);

表合同:

CREATE TABLE tblContracts  
(
    Contract_ID_Old NVARCHAR(30) NOT NULL,
    Contract_ID_New NVARCHAR(15) NOT NULL,
    EVAT_Client NVARCHAR(30) NOT NULL,
    Billing_Type_EID INT NOT NULL,
    User_EID NVARCHAR(50) NOT NULL,
    Type_EID INT NOT NULL,
    EVAT_Company NVARCHAR(30) NOT NULL,
    Status_EID INT NOT NULL,
    Recording_Date SMALLDATETIME NOT NULL 
        CONSTRAINT DF_tblContracts_Recording_Date DEFAULT CONVERT(SMALLDATETIME, GETDATE()),

    PRIMARY KEY (Contract_ID_Old, Contract_ID_New),

    CONSTRAINT tblContracts_Billing_Type_EID_FK 
        FOREIGN KEY (Billing_Type_EID) REFERENCES tblBillingTypeLkp(Billing_Type_ID),

    CONSTRAINT tblContracts_User_EID_FK 
        FOREIGN KEY (User_EID) REFERENCES tblUsers(User_ID),

    CONSTRAINT tblContracts_Type_EID_FK 
        FOREIGN KEY (Type_EID) REFERENCES tblContractTypeLkp(Contract_Type_ID),

    CONSTRAINT tblContracts_Status_EID_FK 
        FOREIGN KEY (Status_EID) REFERENCES tblStatusLkp(Status_ID),

    CONSTRAINT tblContracts_EVAT_Client_Company_FK 
        FOREIGN KEY (EVAT_Client) REFERENCES tblClients(VAT_Number),

    CONSTRAINT tblContracts_EVAT_Company_FK 
        FOREIGN KEY (EVAT_Company) REFERENCES tblClients(VAT_Number)
);

有人可以帮助我找到问题,并避免创建与EVAT_ClientEVAT_Company字段相关的外键重复吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

我在这里回答KumarHarsh的问题(因为在评论中我没有发布图像)。 在图像中将显示表tblContracts的屏幕截图,其中可以看到正确地为该表定义的两个外键。 并且表tblClients的屏幕截图中可以看到两个相同的外键,在我看来,这些外键不正确地存在于表tblClients中。

我希望这有助于找到问题。 谢谢。