ORA-00907: отсутствует правая скобка, все скобки были закрыты, но все еще не работают

#sql #oracle #ora-00907

#sql #Oracle #ora-00907

Вопрос:

Я хочу создать две таблицы Publisher и Book . Вот инструкции SQL для создания таблиц.

Я хочу создать ограничение внешнего ключа в таблице Book. Я не уверен, почему он выдает эту ошибку. Я перепроверил все круглые скобки. Синтаксис вроде бы в порядке, но он не создает таблицу.

 CREATE TABLE Publisher
(
    pub_name varchar2(128) PRIMARY KEY, 
    phone integer, 
    address varchar2(20)
);


CREATE TABLE Book
(
    book_id integer NOT NULL PRIMARY KEY,
    title varchar2(256),
    pub_year number(4) UNSIGNED,
    pub_name REFERENCES Publisher(pub_name) ON DELETE CASCADE ON UPDATE CASCADE
);
 

Комментарии:

1. Где в руководстве Oracle вы обнаружили, что unsigned это допустимый модификатор для number ?

Ответ №1:

В Oracle нет никакого UNSIGNED «ни ON UPDATE CASCADE «.

 SQL> CREATE TABLE Publisher(
  2  pub_name varchar2(128) PRIMARY KEY,
  3  phone    integer,
  4  address  varchar2(20));

Table created.

SQL> CREATE TABLE Book(
  2  book_id  integer NOT NULL PRIMARY KEY,
  3  title    varchar2(256),
  4  pub_year number(4),
  5  pub_name REFERENCES Publisher(pub_name) ON DELETE CASCADE);

Table created.

SQL>
 

Ответ №2:

Одна из ошибок заключается в on update cascade следующем . Однако это вторая ошибка:

 pub_year number(4) UNSIGNED,
 

Поскольку unsigned это здесь недопустимо, вы можете вместо этого использовать ограничение:

 pub_year number(4) check (pub_year > 0),
 

Тем не менее, вам, вероятно, нужно более конкретное ограничение, что-то вроде:

 pub_year number(4) check (pub_year > 1950 and pub_year < 2100),
 

Обратите внимание, что это будет представлять год в виде целого числа ( scale в определении числа есть значение по умолчанию 0 ). Если вы попытаетесь вставить число, например 2020.20, то значение будет усечено — вместо того, чтобы генерировать ошибку.