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。我为此使用模式比较工具。如果约束被命名为相同,以便命名中的差异不会被标记为差异,那很好。 –