новичок sql отсутствует ключевое слово и неверный идентификатор

CREATE table Book
(
book_title varchar (100) not null ,
book_genre char(60) not null,
Date_of_publish date not null,
user_code char(7) not null ,
book_id char (7) primary key not null , 
constraint writer__id_fk foreign key (writer_id),
constraint publisher__id_fk foreign key (publisher_id)

);

я собираюсь

[ORA-00905: отсутствует ключевое слово]

в таблице издателя

CREATE table publisher

(
publisher_id char (7) primary key not null,
publisher_name char(20) not null,
publisher_number char(10) not null,
publisher_email varchar2(60) not null,
publisher_address varchar2(60) not null,
);

я собираюсь

[ORA-00904: неверный идентификатор]


person Fido Dido    schedule 08.11.2017    source источник
comment
ОК, я решил проблему [ORA-00904: : неверный идентификатор]   -  person Fido Dido    schedule 09.11.2017
comment
CREATE table Book ( book_title varchar (100) не null , book_genre char (60) не null , Date_of_publish дата не null , user_code char (7) не null , book_id char (7) первичный ключ не null , ограничение Writer__id_fk внешний ключ ССЫЛКИ писатель ( author_id), ограничение publisher__id_fk внешнего ключа REFERENCES publisher (publisher_id) ); я получаю ORA-00906: отсутствует левая скобка   -  person Fido Dido    schedule 09.11.2017
comment
Все проблемы решены. Спасибо за помощь   -  person Fido Dido    schedule 09.11.2017


Ответы (4)


Добро пожаловать в удивительный мир SQL! :-)

Общее замечание: сообщите нам, какую СУБД вы используете. MySQL? SQL-сервер? Оракул? СКлайт? В разных системах используются разные типы синтаксисов.

Первое утверждение:

Проблема, кажется, в FOREIGN KEY-части. Обычно вы говорите что-то вроде:

CONSTRAINT [constraint_name] FOREIGN KEY([column_in_this_table]) REFERENCES OTHER_TABLE([column_in_other_table])

изменить (добавлено):


[column_in_this_table] должен существовать в вашем DDL (оператор CREATE TABLE), например: CREATE TABLE Book ( book_title ... etc., publisher_id INT, CONSTRAINT FK_publ_id FOREIGN KEY(publisher_id) REFERENCES publisher(publisher_id));

Здесь у вас будет «исходный» столбец с именем «publisher_id» в таблице «publisher». Вы обращаетесь к нему из таблицы "Книга", сначала имея столбец "publisher_id" в таблице "Книга" (который, кстати, должен иметь тот же DDL, что и исходный столбец) . Далее вы добавите FOREIGN KEY в таблицу Book, которая накладывается на столбец Book(publisher_id). Обратите внимание, что вы также можете назвать столбец в таблице «Книга» по-разному, например, «Губка Боб» или «Патрик». Но для будущего использования вы хотели бы использовать соглашения об именах, которые сообщают, что вы можете ожидать найти в столбце. Таким образом, вы бы назвали столбцы тем, что они содержат.


Второе утверждение:

Проблема связана с последней частью вашего заявления, где есть запятая после части NOT NULL для столбца publisher_address.

(Часть) вашего утверждения:

publisher_address varchar2(60) not null, );

Попробуйте заменить это на:

publisher_address VARCHAR2(60) NOT NULL);


редактировать (примечание для себя): VARCHAR2 оказывается допустимым типом данных в базах данных Oracle (см.: документация Oracle)

person RvT    schedule 08.11.2017
comment
Спасибо. я использую оракул - person Fido Dido; 09.11.2017
comment
Спасибо за эту информацию (совет: добавьте «оракул» в качестве тега в свой вопрос). Кроме того, то, что я не увидел ранее: сначала добавьте столбец с именем 'publisher_id' в вашу таблицу Book. Затем добавьте внешний ключ в этот столбец. Вот так (сокращенный пример): CREATE TABLE Book ( book_title ... etc. , publisher_id INT , CONSTRAINT FK_publ_id FOREIGN KEY(publisher_id) REFERENCES publisher(publisher_id) ); Альтернативно: CREATE TABLE Book ( book_title ... etc. , publisher_id INT FOREIGN KEY(publisher_id) REFERENCES publisher(publisher_id) ); но вы не будете иметь никакого контроля над именем CONSTRAINT. - person RvT; 09.11.2017
comment
Большой! Обновлен мой ответ, чтобы включить дополнительную информацию. Принятие любого из данных ответов в качестве предпочтительного ответа также будет оценено любым из ответивших :-) - person RvT; 09.11.2017

Следующий SQL создает FOREIGN KEY в столбце «PersonID» при создании таблицы «Заказы»:

CREATE TABLE Orders (
    OrderID int NOT NULL,
    OrderNumber int NOT NULL,
    PersonID int,
    PRIMARY KEY (OrderID),
    FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
    );

Перейдите по этой ссылке для более подробной информации

https://www.w3schools.com/sql/sql_foreignkey.asp

Надеюсь это поможет.

person nish    schedule 08.11.2017

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

person dfundako    schedule 08.11.2017
comment
Как правильно ссылаться на таблицу. У меня есть таблица, называемая писателем, и таблица, называемая издателем. - person Fido Dido; 09.11.2017

Так что это ответ.

CREATE table Book (book_title varchar (100) не нулевой, book_genre char(60) не нулевой, дата Date_of_publish не нулевая, user_code char(7) не нулевой, publisher_id char (7) не нулевой, author_id char(7) не нулевой, book_id char (7) первичный ключ не нулевой , ОГРАНИЧЕНИЕ book_writer_id_fk ВНЕШНИЙ КЛЮЧ(writer_id) ССЫЛКИ на писателя(writer_id), ОГРАНИЧЕНИЕ book_publisher_id_fk ВНЕШНИЙ КЛЮЧ(publisher_id) ССЫЛКИ на издатель(publisher_id) );

CREATE издатель таблиц

(publisher_id char (7) первичный ключ не нулевой, publisher_name char(20) не нулевой, publisher_number char(10) не нулевой, publisher_email varchar2(60) не нулевой, publisher_address varchar2(60) не нулевой);

person Fido Dido    schedule 09.11.2017