FK参考2子类添加数据时出错

时间:2015-11-24 23:51:35

标签: sql database oracle foreign-keys subclass

我在向此表添加值时遇到问题。底部的两个FK约束是引用共享相同PK的子类实体。我在适当的子类中添加了值。

Oracle正在踢这个错误:ORA-02291

我很确定导致它的原因是表无法分辨哪个表引用FK。是否有一个检查我可以运行以通过两个表来检查FK属于哪个表?

CREATE TABLE Lease(  
leaseNo       CHAR(9),    
duration      NUMBER(1) NOT NULL,    
inDate        DATE      NOT NULL,    
outDate       DATE,    
matNo           CHAR(9),    
plNo            CHAR(9),

CONSTRAINT  lease_pk      PRIMARY KEY (leaseNo),    
CONSTRAINT  student_fk  FOREIGN KEY (matNo) REFERENCES Student(matNo),    
CONSTRAINT  bedroom_fk  FOREIGN KEY (plNo)  REFERENCES BedRoom(plNo),
CONSTRAINT  hallroom_fk FOREIGN KEY (plNo)  REFERENCES HallRoom(plNo)
);

完整型号:

enter image description here

2 个答案:

答案 0 :(得分:1)

您是否有能力更改架构?如果是这样,您可能需要考虑将表BedRoomHallRoom折叠到单个Room表中。然后引入RoomType表来保存类型(' Hall'和#39; Bed')。然后,Room的FK为RoomTypeLease的FK为Room。像这样:

CREATE TABLE RoomType(
    id NUMBER
   ,type VARCHAR2(32)
);


CREATE TABLE Room(
    plno      VARCHAR2(9)
   ,room_type VARCHAR2(32)
   ,rmno      VARCHAR2(4)
   ,rent      NUMBER(6,2)
   ,roomno    VARCHAR2(9)

   ,CONSTRAINT room_pk PRIMARY KEY (plno)
   ,CONSTRAINT room_room_type_fk FOREIGN KEY(room_type) REFERENCES RoomType(id)    
);


CREATE TABLE Lease(  
    leaseNo    VARCHAR2(9),
   ,duration   NUMBER(1) NOT NULL
   ,inDate     DATE      NOT NULL    
   ,outDate    DATE
   ,matNo      CHAR(9)
   ,plNo       CHAR(9)

   ,CONSTRAINT  lease_pk PRIMARY KEY (leaseNo)
   ,CONSTRAINT  student_fk FOREIGN KEY(matNo) REFERENCES Student(matNo)
   ,CONSTRAINT  room_fk FOREIGN KEY(plNo) REFERENCES Room(plNo)
);

答案 1 :(得分:1)

你已经告诉 DBMS,从plno到桌子卧室和厅厅都有FK限制。所以没有“无法分辨哪个表引用FK”。 FK约束表示引用表中列出的列的值必须出现在引用表中的相应列中。当列列表是一个或更多 FK约束中的引用列表时,我们将列列表称为FK。

这是运行时错误。在将它放入Lease plno之前,您未能将一个值放入卧室或Hallroom plno之一。

请显示所有相关信息:DDL,输入表数据,运行的代码,输出表数据和错误消息。