«Недопустимый идентификатор ORA-00904» при добавлении ограничения внешнего ключа - PullRequest
0 голосов
/ 03 ноября 2019

Я пытаюсь создать таблицу «диагностики» (последняя таблица), но что-то не так с двумя строками кода, которые создают внешний ключ. Я уверен, что именно в этом заключается проблема, потому что, когда я их комментирую, я могу создать таблицу. Первые 4 таблицы могут быть созданы без ошибок, поэтому проблем с ними нет. Спасибо за чтение моего вопроса.

Я попытался определить некоторые синтаксические ошибки, но безрезультатно.

CREATE TABLE nurse(
nurse_ID number(5) not null,
nurse_name varchar2(20),
nurse_number number(10),
nurse_address varchar2(50),
CONSTRAINTS nurse_pk PRIMARY KEY (nurse_ID)
);

CREATE TABLE medicine(
med_ID number(10) not null,
med_name varchar2(30),
med_type varchar2(20),
exp_date date,
dose_lim float,
med_components varchar2(50),
CONSTRAINTS med_pk PRIMARY KEY (med_ID)
);

CREATE TABLE in_patient (
in_pat_ID number(5) not null,
in_pat_name varchar2(20),
in_pat_add varchar2(50),
in_pat_dob date,
in_pat_history varchar2(100),
in_mode_payment varchar2(20),
in_start_date date,
in_end_date date,
CONSTRAINTS in_pat_pk PRIMARY KEY (in_pat_ID)
);

CREATE TABLE out_patient (
out_pat_ID number(5) not null,
out_pat_name varchar2(20),
out_pat_add varchar2(50),
out_pat_dob date,
out_pat_history varchar2(100),
out_mode_payment varchar(20),
out_date_of_visit date,
CONSTRAINTS out_pat_pk PRIMARY KEY (out_pat_ID)
);

CREATE TABLE diagnosis(
dia_ref number(12) not null,
dia_type varchar2(20),
dia_date date,
dia_result varchar2(8), --Either Negative or positive.
CONSTRAINTS dia_pk PRIMARY KEY (dia_ref),
--one of the following is going to be null when you insert rows into this table since one diagnosis can only be associated with a single patient
CONSTRAINTS dia_out_fk FOREIGN KEY (out_pat_ID) REFERENCES out_patient (out_pat_ID),
CONSTRAINTS dia_in_fk FOREIGN KEY (in_pat_ID) REFERENCES in_patient (in_pat_ID)
);

Я ожидал, что таблица может быть создана без ошибок.

Ответы [ 4 ]

0 голосов
/ 03 ноября 2019

Лично я предпочитаю определять ограничения на один столбец как часть определения столбца. Тогда вам не нужно повторять имя столбца, а для ограничений FK вы можете позволить столбцу наследовать тип данных своего родителя, чтобы он был менее подвержен ошибкам.

create table in_patient
( in_pat_id          number(5) constraint in_pat_pk primary key
, in_pat_name        varchar2(20)
, in_pat_add         varchar2(50)
, in_pat_dob         date
, in_pat_history     varchar2(100)
, in_mode_payment    varchar2(20)
, in_start_date      date
, in_end_date        date
);

create table out_patient
( out_pat_id         number(5) constraint out_pat_pk primary key
, out_pat_name       varchar2(20)
, out_pat_add        varchar2(50)
, out_pat_dob        date
, out_pat_history    varchar2(100)
, out_mode_payment   varchar(20)
, out_date_of_visit  date
);

create table diagnosis
( dia_ref            number(12) constraint dia_pk primary key
, dia_type           varchar2(20)
, dia_date           date
, dia_result         varchar2(8)
, dia_out_fk         references out_patient (out_pat_id)
, dia_in_fk          references in_patient (in_pat_id)
);

Если dia_result может быть только 'POSITIVE' или 'NEGATIVE', тогда я бы предложил добавить проверочное ограничение для обеспечения этого.

Возможно, еще несколько столбцов можно определить как not null. Хорошая идея - определить все возможные ограничения, о которых вы только можете подумать.

0 голосов
/ 03 ноября 2019

Диагностической таблице нужно добавить столбцы out_pat_ID и in_pat_ID

    CREATE TABLE nurse(

    nurse_ID number(5) not null,
    nurse_name varchar2(20),
    nurse_number number(10),
    nurse_address varchar2(50),
    CONSTRAINTS nurse_pk PRIMARY KEY (nurse_ID)

    );
    CREATE TABLE medicine(

    med_ID number(10) not null,
    med_name varchar2(30),
    med_type varchar2(20),
    exp_date date,
    dose_lim float,
    med_components varchar2(50),

    CONSTRAINTS med_pk PRIMARY KEY (med_ID)

    );
    CREATE TABLE in_patient (

    in_pat_ID number(5) not null,
    in_pat_name varchar2(20),
    in_pat_add varchar2(50),
    in_pat_dob date,
    in_pat_history varchar2(100),
    in_mode_payment varchar2(20),
    in_start_date date,
    in_end_date date,
    CONSTRAINTS in_pat_pk PRIMARY KEY (in_pat_ID)
    );
    CREATE TABLE out_patient (

    out_pat_ID number(5) not null,
    out_pat_name varchar2(20),
    out_pat_add varchar2(50),
    out_pat_dob date,
    out_pat_history varchar2(100),
    out_mode_payment varchar(20),
    out_date_of_visit date,
    CONSTRAINTS out_pat_pk PRIMARY KEY (out_pat_ID)
    );
    CREATE TABLE diagnosis(

    dia_ref number(12) not null,
    dia_type varchar2(20),
    dia_date date,
    dia_result varchar2(8), --Either Negative or positive.
    out_pat_ID number(5) not null,
    in_pat_ID number(5) not null,

    CONSTRAINTS dia_pk PRIMARY KEY (dia_ref),
    --one of the following is going to be null when you insert rows into this table since one diagnosis can only be associated with a single patient
    CONSTRAINTS dia_out_fk FOREIGN KEY (out_pat_ID) REFERENCES out_patient (out_pat_ID),
    CONSTRAINTS dia_in_fk FOREIGN KEY (in_pat_ID) REFERENCES in_patient (in_pat_ID)

    );

db <> скрипка здесь

0 голосов
/ 03 ноября 2019

Если вы разрешаете только одного пациента для каждого диагноза, тогда у вас должно быть ограничение check. Ваш комментарий и структура данных не синхронизированы:

CREATE TABLE diagnosis (
    dia_ref number(12) not null,
    dia_type varchar2(20),
    dia_date date,
    dia_result varchar2(8), --Either Negative or positive.
    out_pat_ID number(5),
    in_pat_ID number(5),
    constraint chk_diagnosis_pat_id
        check ( (out_pat_id is not null and in_pat_id is null) or
                (out_pat_id is null and in_pat_id is not null)
              ),                 
    constraint dia_pk primary key (dia_ref),
    --one of the following is going to be null when you insert rows into this table since one diagnosis can only be associated with a single patient
    constraint dia_out_fk foreign key (out_pat_ID) references out_patient (out_pat_ID),
    constraints dia_in_fk foreign key (in_pat_ID) references in_patient (in_pat_ID)
);

При этом отдельные таблицы для стационарных и амбулаторных пациентов выглядят некорректно. Или, по крайней мере, вам нужна таблица persons с информацией о человеке с течением времени. Тогда у вас могут быть отдельные «назначения» и «регистрации», чтобы определить, назначают ли они амбулаторное посещение или регистрируются для стационарного лечения.

0 голосов
/ 03 ноября 2019

Ваша таблица diagnosis ссылается на out_pat_ID и in_pat_ID как на столбцы, которые должны служить внешними ключами, но эти столбцы на самом деле не существуют в определении таблицы. Попробуйте добавить их как одно из возможных исправлений здесь:

CREATE TABLE diagnosis (
    dia_ref number(12) NOT NULL,
    dia_type varchar2(20),
    dia_date date,
    dia_result varchar2(8),
    out_pat_ID number(5),
    in_pat_ID number(5)
    CONSTRAINT dia_pk PRIMARY KEY (dia_ref),
    CONSTRAINT dia_out_fk FOREIGN KEY (out_pat_ID) REFERENCES out_patient (out_pat_ID),
    CONSTRAINT dia_in_fk FOREIGN KEY (in_pat_ID) REFERENCES in_patient (in_pat_ID)
);
...