Ошибка SQL: ORA-00907: проблема с отсутствующей правой круглой скобкой

CREATE TABLE ADMIN (
    A_EMP_ID                   CHAR 5 BYTE                            NOT NULL,
    ADMIN_START_DATE           DATE                 DEFAULT SYSDATE       NOT NULL,
    ADMIN_END_DATE             DATE                                       NULL,
    DIVERSITY_TRAINING_CERT      CHAR(1 BYTE)       DEFAULT 'N'           NOT NULL,
    ADMIN_TITLE                  CHAR(40 BYTE)                            NULL,
    CONSTRAINT                   ADMIN_PK           PRIMARY KEY(A_EMP_ID),
  CONSTRAINT        ADMIN_FK1          
  FOREIGN KEY(A_EMP_ID)
  REFERENCES ADMIN(A_EMP_ID),
  CONSTRAINT                 ADMIN_DIVERSITY_CERT
      CHECK (DIVERSITY_TRAINING_CERT = 'N','Y'),
  CONSTRAINT                 ADMIN_END_DATE
      CHECK (<= 'ADMIN_START_DATE'),
    );



Error starting at line : 1 in command -
CREATE TABLE ADMIN (
    A_EMP_ID                   CHAR 5 BYTE                            NOT NULL,
    ADMIN_START_DATE           DATE                 DEFAULT SYSDATE       NOT NULL,
    ADMIN_END_DATE             DATE                                       NULL,
    DIVERSITY_TRAINING_CERT      CHAR(1 BYTE)       DEFAULT 'N'           NOT NULL,
    ADMIN_TITLE                  CHAR(40 BYTE)                            NULL,
    CONSTRAINT                   ADMIN_PK           PRIMARY KEY(A_EMP_ID),
  CONSTRAINT        ADMIN_FK1          
  FOREIGN KEY(A_EMP_ID)
  REFERENCES ADMIN(A_EMP_ID),
  CONSTRAINT                 ADMIN_DIVERSITY_CERT
      CHECK (DIVERSITY_TRAINING_CERT = 'N','Y'),
  CONSTRAINT                 ADMIN_END_DATE
      CHECK (<= 'ADMIN_START_DATE'),
    )
Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

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


person Barry Robinholt    schedule 10.11.2015    source источник
comment
вы редактировали код, я уже видел некоторые опечатки ...   -  person kevinskio    schedule 10.11.2015
comment
Извините, я пытался поставить его изображение, но похоже, что это не работает. Я снова вставил код. Здесь он расположен неправильно, когда я копирую и вставляю его из Oracle.   -  person Barry Robinholt    schedule 10.11.2015
comment
Там он теперь лучше смотрит.   -  person Barry Robinholt    schedule 10.11.2015
comment
пожалуйста, обновите свой код своими изменениями, чтобы нам не пришлось щуриться в комментариях   -  person kevinskio    schedule 10.11.2015


Ответы (3)


В вашем заявлении много неправильного.

  • A_EMP_ID CHAR 5 BYTE отсутствует (..) вокруг ограничения длины
  • Вы определенно не хотите использовать CHAR для admin_title. Вместо этого используйтеVARCHAR2.
  • DIVERSITY_TRAINING_CERT = 'N','Y' не является допустимым выражением. Вы, наверное, хотите diversity_training_cert IN ('N','Y')
  • Хотя FOREIGN KEY (a_emp_id) REFERENCES admin(a_emp_id) синтаксически правильно, это не имеет смысла. Думаю, тебе нужен manager_id или что-то подобное. А потом что-то вроде FOREIGN KEY (manager_id) REFERENCES admin(a_emp_id).
    В качестве альтернативы вы, возможно, намереваетесь сослаться на employee таблицу. В этом случае тип данных a_emp_id должен соответствовать типу столбца PK в этой таблице.
  • CONSTRAINT ADMIN_END_DATE CHECK (<= 'ADMIN_START_DATE'), имеет три ошибки:

    • a column must not be enclosed in single quotes. So it has to be admin_start_date not 'admin_start_date'
    • контрольное ограничение требует правильного условия. <= admin_start_date это не условие, вам нужно с чем-то сравнить столбец. Предположительно admin_end_date
    • после этого выражения стоит запятая ,, что тоже неверно.

Собирая все вместе, вы получаете:

CREATE TABLE admin 
(
    a_emp_id                  CHAR(5 BYTE) NOT NULL, 
    admin_start_date          DATE DEFAULT SYSDATE NOT NULL,
    admin_end_date            DATE NULL,
    diversity_training_cert   CHAR(1 BYTE)  DEFAULT 'N' NOT NULL,
    admin_title               VARCHAR2(40 BYTE) NULL,
    CONSTRAINT admin_pk 
        PRIMARY KEY(a_emp_id),
    CONSTRAINT admin_fk1 
        FOREIGN KEY (a_emp_id) REFERENCES admin(a_emp_id),
    CONSTRAINT admin_diversity_cert 
        CHECK (diversity_training_cert IN ('N','Y')), 
    CONSTRAINT admin_end_date 
        CHECK ( admin_end_date <= admin_start_date) 
);

Несвязно, но: писать все прописными буквами тоже совершенно незачем.

person a_horse_with_no_name    schedule 10.11.2015
comment
Еще одна вещь, которую я рекомендовал в моем предыдущем удаленном ответе (поскольку вы сделали это первым), - это использовать числовой тип в поле идентификатора, чтобы он мог использовать последовательность для его заполнения. +1 - person Jorge Campos; 10.11.2015
comment
@JorgeCampos: вы не знаете, как определяется emp_id. Это может быть что-то вроде XY-42. Использование char для этого не обязательно неправильно (но, безусловно, для столбца заголовка) - person a_horse_with_no_name; 10.11.2015
comment
@JorgeCampos - за исключением того, что это тоже FK, так что соответствующая запись admin ... подождите, это FK ссылается на себя? Хм? Я ожидал, что FK выведет, скажем, таблицу сотрудников, поэтому администратор должен быть сотрудником. В этом случае тип данных that должен совпадать, что я и собирался сделать - что тип данных a_emp_id не может быть изменен изолированно. (Но, конечно, номер может быть подходящим для обеих таблиц). - person Alex Poole; 10.11.2015
comment
@AlexPoole: Думаю, в таблице отсутствует столбец manager_id или что-то подобное. - person a_horse_with_no_name; 10.11.2015
comment
kkkkkkkkkkkkkkkkkkkkkkkkkkkkk @AlexPoole очень хорошо ... пропустил! - person Jorge Campos; 10.11.2015
comment
Здесь много обсуждается использование поля varchar в качестве первичного ключа, и большая часть из них (даже если не учитывать контекст решения OP) предполагают, что это не очень хорошая практика. Мне особенно нравится этот ответ от @Remus stackoverflow.com/a/1301536/460557 по этому поводу. Поэтому это было бы просто предложение, возможно, ОП только начинает рассматривать количество ошибок в своем коде, а он даже не знает этого. - person Jorge Campos; 10.11.2015
comment
@JorgeCampos: ну, связанный ответ предназначен для SQL Server, и там он действительно имеет значение из-за кластерного индекса, которым, по сути, является PK. Если у вас есть столбец, который является уникальным и стабильным, чтобы быть PK, добавление другого уникального столбца (с другим индексом для обслуживания) на самом деле не так много для вас в Oracle . Могут быть ситуации, когда размер имеет значение, особенно когда на столбец часто ссылаются, но это выходит за рамки темы (и основывается на мнении) - person a_horse_with_no_name; 10.11.2015
comment
@a_horse_with_no_name Я тоже прочитал ссылку, но связанная с концепцией относится ли это к оракулу? Особенно что касается архивных данных и кластеризации? - person Moudiz; 10.11.2015

Перед последней круглой скобкой стоит незавершенная запятая.

person Antonino Nocera    schedule 10.11.2015
comment
ПРОВЕРИТЬ (‹= 'ADMIN_START_DATE'), но по-прежнему возвращается без правой круглой скобки - person Barry Robinholt; 10.11.2015

CHAR 5 BYTE должен быть CHAR (5 BYTE) (но CHAR не следует использовать в любом случае, попробуйте VARCHAR2 или NVARCHAR2 ...)

и ограничение ‹= 'ADMIN_START_DATE' неверно. У него должно быть два значения для сравнения

person kevinskio    schedule 10.11.2015
comment
СОЗДАТЬ ТАБЛИЦУ ADMIN (A_EMP_ID CHAR (5 BYTE) NOT NULL, ADMIN_START_DATE DATE DEFAULT SYSDATE NOT NULL, ADMIN_END_DATE DATE DATE NULL, DIVERSITY_TRAINING_CERT CHAR (1 BYTE) DEFAULT 'NULL' NOT NULL ADMARIN ADMIN_KEY (PRSTRAIN_NULL) ADMARIN ADMARIN A_EMP_ID), ОГРАНИЧЕНИЕ ADMIN_FK1 ИНОСТРАННЫЙ КЛЮЧ (A_EMP_ID) - person Barry Robinholt; 10.11.2015
comment
ССЫЛКИ ADMIN (A_EMP_ID), CONSTRAINT ADMIN_DIVERSITY_CERT CHECK (DIVERSITY_TRAINING_CERT = 'N', 'Y'), CONSTRAINT CHECK ('ADMIN_END_DATE' ›= 'ADMIN_START_DATE')); - person Barry Robinholt; 10.11.2015