由于原始平台上的位置不同,我的数据库中的大多数表都包含复合主键,但身份只在给定位置唯一。我有一个Period
表,其中包含由FiscalYear
和PeriodID
分隔的会计年度的开始日期和结束日期。 PeriodID
重复1-12,因此此表的主键是FiscalYear
和PeriodID
FiscalYear INT NOT NULL,
PeriodID TINYINT NOT NULL,
PeriodStart DATE NOT NULL,
PeriodEnd DATE NOT NULL,
PeriodWeeks TINYINT NOT NULL,
QuarterID TINYINT NOT NULL,
DateManipulate DATE NOT NULL,
CONSTRAINT [PK_Period] PRIMARY KEY (PeriodID, FiscalYear)
我还有一个Clinic.Dates
表,它使用相同的FiscalYear
和PeriodID
,但每个位置都有唯一的数据。我将这些分开,因此我没有相同FiscalYear
和PeriodID
的40个实例,日期范围会重复。
ClinicID INT NOT NULL CONSTRAINT [FK_ClinicDates] FOREIGN KEY REFERENCES Clinic.Master(ClinicID),
FiscalYear INT NOT NULL,
PeriodID TINYINT NOT NULL,
PeriodDays INT NOT NULL,
CONSTRAINT [PK_Dates] PRIMARY KEY (ClinicID, PeriodID, FiscalYear)
我遇到的问题是在这些表之间创建外键约束,因为列本身并不是唯一的。
ALTER TABLE Clinic.Dates ADD
CONSTRAINT FK_PeriodDates FOREIGN KEY(FiscalYear, PeriodID) REFERENCES Clinic.Period(FiscalYear, PeriodID)
GO
我得到的错误是:
引用表'Clinic.Period'中没有主键或候选键与外键'FK_PeriodDates'中的引用列列表匹配。
我的问题:还有另一种解决方法吗?主键存在于Clinic.Period
表中,但在尝试进行此FK约束时无法识别。
更新:以下是两个表的几个数据示例,以获得更好的视角。
答案 0 :(得分:1)
你有向后的参考。它应该从Clinic.Periods
表转到 Clinic.Dates
:
ALTER TABLE Clinic.Periods ADD
CONSTRAINT FK_PeriodDates FOREIGN KEY(FiscalYear, PeriodID) REFERENCES Clinic.Dates(FiscalYear, PeriodID)
GO