3

我有两个父表:TreatmentVisit.

治疗表:

 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. 已经有一个类似的问题,但我不太明白适用于我的案例的逻辑。我一一引用每一列,它适用于Treatment表父级。我应该如何更正参考Visit表父级?

4

2 回答 2

12
 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)
);
于 2013-06-20T04:01:29.950 回答
3

外键必须引用父表的主键——整个主键。在您的情况下,Visit表的主键只是来自仅引用SlotNum, DateVisit的外键。Visit_TreatSlotNum

你有两个不错的选择:

  1. 添加一DateVisitVisit_Treat并将外键设为SlotNum, DateVisit,引用SlotNum, DateVisitin Visit

  2. 在上创建一个非业务主键Visit(例如,名为VisitIDtype的列NUMBER,由序列提供),将VisitID列添加到Visit_Treat,并将其设为外键。

还有两个不好的选择:

  1. 将主键更改Visit为只有SlotNum这样您的Visit_Treat外键才能工作。这可能不是你想要的。

  2. 不要使用外键。我不推荐这个选项。如果您在设置您知道应该存在的外键时遇到问题,这通常意味着设计问题。

于 2013-06-20T04:03:22.370 回答