SQL。如何引用复合主键Oracle?

时间:2013-06-20 03:36:44

标签: sql oracle composite-primary-key

我有两个父表: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。已经有一个similar question,但我并没有完全适用于我的情况。我逐个引用每一列,它适用于Treatment表父级。我该如何纠正参考Visit表格父母?

2 个答案:

答案 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

您有两个不错的选择:

  1. DateVisit添加Visit_Treat列,外键为SlotNum, DateVisit,引用SlotNum, DateVisit中的Visit

    < / LI>
  2. Visit上创建非业务主键(例如,类型为VisitID的{​​{1}}列,由序列提供),添加{{1} }列到NUMBER,并将其设为外键。

  3. 还有两个糟糕的选择:

    1. VisitID主键更改为Visit_Treat,以便Visit外键可用。这可能不是你想要的。

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