#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, то значение будет усечено — вместо того, чтобы генерировать ошибку.