5

如果我聲明下面的表,是否隱含暗示這兩個外鍵是唯一的主鍵還是需要做更多的事情才能使這兩個屬性成爲主鍵?SQL多個外鍵作爲主鍵

CREATE TABLE Report_has_Items 
(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL 
) 

基本上來自其他表的外鍵的兩個屬性一起形成唯一鍵。

回答

9

不,它不。上表沒有主鍵。如果你想使用這些字段作爲主鍵使用:

CREATE TABLE Report_has_Items(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL, 
    PRIMARY KEY (ReportID, ItemID) 
) 

或類似的東西取決於你的sql dilect。

3

我不知道我完全理解你的問題,但我假設你正在嘗試創建一個組合主鍵(具有多個屬性的主鍵)。你可以做以下事情。

CREATE TABLE Report_has_Items(
    ReportID int references Report(ReportID), 
    ItemID int references Item(ItemID), 
    PRIMARY KEY (ReportID , ItemID) 
); 

:然後,對(ReportID,項ID)必須爲表獨特和既不值可以爲NULL。

Here is a very useful link for SQL Queries

5

讓我們命名我們的約束,是嗎?

CREATE TABLE dbo.Report_has_Items(
    ReportID int NOT NULL, 
     CONSTRAINT [FK_RHI_Report] (ReportId) REFERENCES dbo.Report(ReportID), 
    ItemID int NOT NULL, 
     Constraint [FK_RHI_Item] (ItemId) REFERENCES dbo.Item(ItemID), 
    CONSTRAINT [PK_RHI] PRIMARY KEY (ReportID, ItemID) 
) 
+0

命名約束有什麼好處? – Kairan

+1

@Kairan - 一個主要的好處是,如果一個查詢(插入,更新,刪除)違反約束,將會用約束名稱生成錯誤消息。如果約束名稱清晰且具有描述性,則錯誤消息將更易於理解;如果約束名稱是隨機的,那麼它就不那麼清楚了。 – Gayu

+0

我的主要原因是環境中的一致性。我是一名支持DBA。該工作的一部分是將更改從DEV轉移到QA到PROD。我爲此使用模式比較工具。如果約束被命名爲相同,以便命名中的差異不會被標記爲差異,那很好。 –