ORA-00907: отсутствует правильная скобка, я не могу найти, что не так - PullRequest
0 голосов
/ 19 января 2020
CREATE TABLE sangre
(    id_pruebas    VARCHAR2(10)
         CONSTRAINT san_id_pruebas_pk    PRIMARY KEY,
     tipo VARCHAR2(5)    NOT NULL
         CONSTRAINT san_tipo_pruebas  CHECK (tipo = 'O-' OR 
         tipo = 'O+' OR tipo = 'A-' OR tipo = 'A+' OR tipo = 'B-'
         tipo = 'B+' OR tipo = 'AB-' OR tipo = 'AB+'),
     fecha DATE  NOT NULL,
     id_sal    VARCHAR2(1O) NOT NULL,
     id_paciente    NUMBER(8) NOT NULL
         CONSTRAINT san_id_paciente_ck  CHECK (id_paciente >= 0),
     id_enfermero    VARCHAR2(10) NOT NULL,
         CONSTRAINT san_id_enfermero_fk FOREIGN KEY (id_enfermero)
         REFERENCES enfermero (id_enfermero),
         CONSTRAINT san_id_paciente_fk FOREIGN KEY (id_paciente)
         REFERENCES paciente(id_paciente),
         CONSTRAINT san_tipo_pruebas_pk FOREIGN KEY (id_sal)
         REFERENCES laboratorio(id_sal));

Я проверил все скобки и предыдущий код, который я сделал (похоже на это), и я просто не могу найти, что не так.

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Вы пропускаете or после OR tipo = 'B-', а VARCHAR2(1O) после id_sal содержит букву O вместо числа 0.

Это было бы легче определить По крайней мере, для меня, когда ограничения встроены, а код выложен более четко:

create table enfermero   (id_enfermero varchar2(10) primary key);
create table paciente    (id_paciente  number       primary key check (id_paciente >= 0));
create table laboratorio (id_sal       varchar2(10) primary key);

create table sangre
( id_pruebas    varchar2(10) constraint san_id_pruebas_pk primary key
, tipo          varchar2(5)  not null   constraint san_id_paciente_ck check (tipo in ('O-', 'O+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+'))
, fecha         date         not null
, id_sal        not null     constraint san_tipo_pruebas_fk references laboratorio (id_sal)
, id_paciente   not null     constraint san_id_paciente_fk  references paciente (id_paciente)
, id_enfermero  not null     constraint san_id_enfermero_fk references enfermero (id_enfermero)
);

Проверочное ограничение для id_paciente >= 0, по-видимому, принадлежит paciente, если не существует более сложного бизнес-правила. в которых другие таблицы могут иметь отрицательные значения для paciente.id_paciente, а sangre - нет.

Я переименовал ограничение внешнего ключа san_tipo_pruebas_pk в san_tipo_pruebas_fk.

Длинный список or условия в san_id_paciente_ck легче читать как список in.

1 голос
/ 19 января 2020

В вашем коде много ошибок, наиболее выдающимися из которых являются:

  • пропущенные запятые в конце строк
  • искаженный PRIMARY KEY ограничение
  • опечатки: VARCHAR2(1O) вместо VARCHAR2(10)

Рассмотрим следующее утверждение, которое отлично работает в в этой скрипте БД :

CREATE TABLE sangre(    
    id_pruebas VARCHAR2(10),
        CONSTRAINT san_id_pruebas_pk PRIMARY KEY(id_pruebas),
        tipo VARCHAR2(5) NOT NULL,
        CONSTRAINT san_tipo_pruebas 
            CHECK (tipo IN ('O-', 'O+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+')),
    fecha DATE NOT NULL,
        id_sal VARCHAR2(10) NOT NULL,
        id_paciente NUMBER(8) NOT NULL,
        CONSTRAINT san_id_paciente_ck  
            CHECK (id_paciente >= 0),
        id_enfermero VARCHAR2(10) NOT NULL,
        CONSTRAINT san_id_enfermero_fk 
            FOREIGN KEY (id_enfermero) REFERENCES enfermero (id_enfermero),
        CONSTRAINT san_id_paciente_fk 
            FOREIGN KEY (id_paciente) REFERENCES paciente(id_paciente),
        CONSTRAINT san_tipo_pruebas_pk 
            FOREIGN KEY (id_sal) REFERENCES laboratorio(id_sal)
);

Примите также к сведению, что я упростил ограничение CHECK для tipo, используя IN вместо OR ed условий.

Кроме того, вы можете рассмотреть следующий синтаксис, который сокращает код путем встраивания внешних ключей и проверки ограничений (единственный недостаток состоит в том, что вы не можете выбрать имя ограничений):

CREATE TABLE sangre(    
    id_pruebas VARCHAR2(10) PRIMARY KEY,
    tipo VARCHAR2(5) NOT NULL   
        CHECK (tipo IN ('O-', 'O+', 'A-', 'A+', 'B-', 'B+', 'AB-', 'AB+')),
    fecha DATE NOT NULL,
    id_sal VARCHAR2(10) NOT NULL
        REFERENCES laboratorio(id_sal),
    id_paciente NUMBER(8) NOT NULL
        CHECK (id_paciente >= 0)
        REFERENCES paciente(id_paciente),
    id_enfermero VARCHAR2(10) NOT NULL
        REFERENCES enfermero (id_enfermero)
);

Демонстрация на DB Fiddle

...