Oracle продолжает показывать «ORA-00907: отсутствует правильная скобка», что я делаю неправильно? - PullRequest
0 голосов
/ 15 октября 2019
CREATE TABLE transaction_order
(
national_ID VARCHAR2 (20) FOREIGN KEY REFERENCES client (national_ID),
account_no VARCHAR2 (25) FOREIGN KEY REFERENCES account (account_no),
transaction_ID VARCHAR2 (20) FOREIGN KEY REFERENCES transaction (transaction_ID),
date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

У вас неправильный синтаксис, правильный:

CREATE TABLE transaction_order
(
national VARCHAR2 (20)  REFERENCES client (national_ID),
account_no VARCHAR2 (25) REFERENCES account (account_no),
transaction_ID VARCHAR2 (20)  REFERENCES transaction (transaction_ID),
date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);

Без FOREIGN KEY

0 голосов
/ 15 октября 2019

ORA-00907: отсутствует правая скобка

Это сообщение является одним из сообщений общего синтаксиса Oracle. Это означает, что наш SQL не будет компилироваться, потому что в операторе отсутствует пропущенное ключевое слово или запятая, или ключевое слово не на своем месте. В этом случае это объясняется тем, что компилятору не нравятся ваши встроенные предложения внешнего ключа.

Встроенные объявления внешнего ключа либо многословны с ключевыми словами CONSTRAINT и FOREIGN KEY, а также REFERENCES, либо лаконичны только с помощью REFERENCES.

На самом деле, если вы собираетесь использовать минималистскую нотацию, почему бы не пойти ва-банк? Эта строка ...

national_ID  REFERENCES client

... создает внешний ключ для первичного ключа таблицы CLIENT и автоматически соответствует типу данных столбца ссылки.

Так что всенужно это ...

CREATE TABLE transaction_order
(
national_ID  REFERENCES client ,
account_no   REFERENCES account ,
transaction_ID REFERENCES transaction,
transaction_date DATE NOT NULL,
time NUMBER (10) NOT NULL,
place VARCHAR2 (20) NOT NULL,
new_balance VARCHAR2 (20) NOT NULL
);

Обратите внимание, я изменил имя transaction_date: plain DATE - это зарезервированное ключевое слово Oracle, поэтому нам не разрешено использовать его в качестве идентификатора.

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

0 голосов
/ 15 октября 2019

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

CREATE TABLE TRANSACTION_ORDER (
       NATIONAL_ID      VARCHAR2(20),
       CONSTRAINT ID_XFK FOREIGN KEY ( NATIONAL_ID )
              REFERENCES CLIENT ( NATIONAL_ID ),
       ACCOUNT_NO       VARCHAR2(25),
       CONSTRAINT NO_XFK FOREIGN KEY ( ACCOUNT_NO )
              REFERENCES ACCOUNT ( ACCOUNT_NO ),
       TRANSACTION_ID   VARCHAR2(20),
       CONSTRAINT TRAN_ID_XFK FOREIGN KEY ( TRANSACTION_ID )
              REFERENCES TRANSACTION ( TRANSACTION_ID ),
       DATES            DATE NOT NULL,
       TIME             NUMBER(10) NOT NULL,
       PLACE            VARCHAR2(20) NOT NULL,
       NEW_BALANCE      VARCHAR2(20) NOT NULL
);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...