复合主键sql关系

时间:2012-11-21 17:48:08

标签: sql sql-server-2008 primary-key sql-server-2012

我需要在ReportID之间创建一个关系,它是复合主键的一部分。 这是我为Microsoft SQL Server编写的代码:

CREATE TABLE Tableone
(
    ReportID varchar UNIQUE,
    Date date,
    Line ommited

PRIMARY KEY (ReportNumber, Date)
)

CREATE TABLE Tabletwo
(
    Line omitted
    Line ommited
    ReportID varchar UNIQUE FOREIGN KEY REFERENCES Tableone(ReportID),
    Line ommited

    PRIMARY KEY (XX, XXX, ReportID)
)

更新:我们已经明确要求我们将ReportIDDate设置为Tableone中的主键,但仅提及ReportID中的Tabletwo

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

如果您有复合主键,则引用它的所有外键约束必须使用复合主键的所有列

因此,在您的情况下,TableTwo 必须引用TableOne(ReportID, Date)

解决这个问题的唯一方法是在UNIQUE INDEX上创建TableOne (ReportID) - 然后您可以单独创建对该唯一约束的外键引用。

但那引出了一个问题:为什么ReportID不是唯一的主键,如果它已经是唯一的(因为你可以在它上放UNIQUE INDEX)和NOT NULL(因为它是化合物PK)?

第1步:创建UNIQUE INDEX

CREATE UNIQUE NONCLUSTERED INDEX UIX_TableOne ON dbo.TableOne(ReportID);

第2步:从TableTwo

创建外键
ALTER TABLE dbo.TableTwo
ADD CONSTRAINT FK_TableTwo_TableOne
FOREIGN KEY(ReportID) REFERENCES dbo.TableOne(ReportID)