我有两个父表:Treatment
和Visit
。
治疗台:
create table Treatment (
TreatCode CHAR(6) constraint cTreatCodeNN not null,
Name VARCHAR2(20),
constraint cTreatCodePK primary key (TreatCode),
);
访问表:
create table Visit (
SlotNum NUMBER(2),
DateVisit DATE,
ActualArrivalTime DATE,
constraint cVisitSlotDatePK primary key (SlotNum, DateVisit)
);
现在我尝试创建一个子表:
create table Visit_Treat (
TreatCode constraint cTreatCodeFK references Treatment(TreatCode),
SlotNum constraint cSlotNumFK references Visit(SlotNum),
DateVisit constraint cDateFK references Visit(DateVisit),
constraint cVisitTreatPK primary key (SlotNum, TreatCode, DateVisit)
);
一切都很好,直到3行。从第3行开始,即SlotNum constraint ...
,会显示一条消息:no matching unique or primary key
。已经有一个similar question,但我并没有完全适用于我的情况。我逐个引用每一列,它适用于Treatment
表父级。我该如何纠正参考Visit
表格父母?
答案 0 :(得分:8)
CONSTRAINT fk_column
FOREIGN KEY (column1, column2, ... column_n)
REFERENCES parent_table (column1, column2, ... column_n)
在你的情况下
create table Visit_Treat (
TreatCode CHAR(6) constraint cTreatCodeFK references Treatment(TreatCode),
SlotNum NUMBER(2),
DateVisit DATE,
constraint cVisitTreatPK primary key (SlotNum, TreatCode, DateVisit),
constraint fk_slotnumDatevisit FOREIGN KEY(SlotNum,DateVisit)
references Visit(SlotNum,DateVisit)
);
答案 1 :(得分:3)
外键必须引用父表的主键 - 整个主键。在您的情况下,Visit
表的主键为SlotNum, DateVisit
,但来自Visit_Treat
的外键仅引用SlotNum
。
您有两个不错的选择:
向DateVisit
添加Visit_Treat
列,外键为SlotNum, DateVisit
,引用SlotNum, DateVisit
中的Visit
。
在Visit
上创建非业务主键(例如,类型为VisitID
的{{1}}列,由序列提供),添加{{1} }列到NUMBER
,并将其设为外键。
还有两个糟糕的选择:
将VisitID
主键更改为Visit_Treat
,以便Visit
外键可用。这可能不是你想要的。
不要使用外键。我不推荐这个选项。如果您在设置应该存在的外键时遇到问题,通常意味着设计问题。