如何在SQL中有相同的外键有多个引用?

时间:2018-05-18 17:36:00

标签: sql oracle

我试图将关系表示法带到SQL但是我得到以下错误(我的sql然后错误)

CREATE TABLE REQUISITION
(REQNO CHAR(6) CONSTRAINT REQNO_PK PRIMARY KEY,
STAFFNO REFERENCES STAFF_CHARGENURSE(STAFFNO),
STAFFNAME REFERENCES SUPPLIES_PHARMACEUTICAL(STAFFNAME),
STAFFNAME REFERENCES SUPPLIES_SURGICAL(STAFFNAME),
STAFFNAME REFERENCES SUPPLIES_NON-SURGICAL(STAFFNAME),
WARDNO CHAR(6),
ITEMNO CHAR(6),
QUANTITY INT,
DATEORDERED DATE,
DATERECIEVED DATE);
STAFFNAME REFERENCES SUPPLIES_SURGICAL(STAFFNAME),
*
ERROR at line 5: 
ORA-00957: duplicate column name

如何在SQL中输入多个外键?所有itemNo都指向MANDATORY,OR关系中的超类,这就是为什么他们将itemNo的3个实例作为外键的原因。 Relationary:

Requisition(reqNo, staffNo, staffName, wardNo, itemNo, quantity, dateOrdered, dateRecieved)
    Primary Key reqNo
    Foreign Key staffNo references Staff_ChargeNurse(staffNo)
    Foreign Key itemNo references Supplies_Pharmaceutical(itemNo)
    Foreign Key itemNo references Supplies_Surgical(itemNo)
    Foreign Key itemNo references Supplies_Non-Surgical(itemNo)

2 个答案:

答案 0 :(得分:1)

您可以使用明确的CONSTRAINT语法:

CREATE TABLE REQUISITION(
    REQNO CHAR(6) CONSTRAINT REQNO_PK PRIMARY KEY,
    STAFFNO REFERENCES STAFF_CHARGENURSE(STAFFNO),
    STAFFNAME data_type,
    WARDNO CHAR(6),
    ITEMNO CHAR(6),
    QUANTITY INT,
    DATEORDERED DATE,
    DATERECIEVED DATE,
    CONSTRAINT FK_1 FOREIGN KEY (ItemNo) 
         REFERENCES SUPPLIES_PHARMACEUTICAL(ItemNo), 
    CONSTRAINT FK_2 FOREIGN KEY (ItemNo)  
         REFERENCES SUPPLIES_SURGICAL(ItemNo),
    CONSTRAINT FK_3 FOREIGN KEY (ItemNo) 
         REFERENCES SUPPLIES_NON_SURGICAL(ItemNo)
);

答案 1 :(得分:1)

您需要itemno上的三个约束,而不是三个itemno列:

create table requisition
( reqno         varchar2(6) constraint reqno_pk primary key
, staffno       references staff_chargenurse(staffno)
, staffname     varchar2(20)
, wardno        varchar2(6)
, itemno        constraint fk_1 references supplies_pharmaceutical(itemno)
                constraint fk_2 references supplies_surgical(itemno)
                constraint fk_3 references supplies_nonsurgical(itemno)
, quantity      int
, dateordered   date
, daterecieved  date );

您可以命名约束或让系统执行此操作。在上面的示例中,staffno上的FK在我的数据库中被命名为SYS_C0018431。像这样的随机名称可以进一步创造额外的工作。

编辑:刚刚注意到您在此示例中使用STAFFNAME,在这种情况下(假设三个SUPPLIES_表在STAFFNAME上有主键或唯一键):

create table requisition
( reqno         varchar2(6) constraint reqno_pk primary key
, staffno       references staff_chargenurse(staffno)
, staffname     constraint rs1 references supplies_pharmaceutical(staffname)
                constraint rs2 references supplies_surgical(staffname)
                constraint rs3 references supplies_nonsurgical(staffname)
, wardno        varchar2(6)
, itemno        varchar2(6)
, quantity      int
, dateordered   date
, daterecieved  date );

您也可以在表级别或单独的语句中定义它们,但是它们不能继承(第一个)父级的数据类型。

  

所有itemNo都指向MANDATORY, OR关系中的超类,这就是为什么他们将itemNo的3个实例作为外键。

之前我没有听说过“强制性”或“关系”,我认为这不是一个标准的数据建模术语。也许它来自你正在使用的一些工具。

这里没有超类,这些都不是任何实例。您正在定义引用三个单独的数据库表的三个外键约束。外键约束是指定列的所有值必须存在于指定父表中的规则。