Как один и тот же внешний ключ может иметь несколько ссылок в SQL? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь перенести реляционное представление в 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 указывают на суперкласс в ОБЯЗАТЕЛЬНОМ, ИЛИ взаимосвязи, поэтому они являются 3 экземплярами itemNo в качестве внешнего ключа.Отношение:

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 голосов
/ 20 мая 2018

Требуется три ограничения на 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 );

Вы можете либо назвать ограничения, либо позволить системе сделать это.В приведенном выше примере FK на staffno был назван 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, поэтому они являются 3 экземплярами itemNo в качестве внешнего ключа.

До этого я не слышал об отношениях 'ОБЯЗАТЕЛЬНО, ИЛИ' иЯ не думаю, что это стандартный термин моделирования данных.Возможно, это какой-то инструмент, который вы используете.

Здесь нет суперкласса, и это не примеры чего-либо.Вы определяете три ограничения внешнего ключа, ссылаясь на три отдельные таблицы базы данных.Ограничение внешнего ключа - это правило, согласно которому все значения указанного столбца должны существовать в указанной родительской таблице.

0 голосов
/ 18 мая 2018

Вы можете использовать явный синтаксис 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)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...