2011-01-28 2 views
1

Я новичок в SQL, этот сегмент должен просто сделать несколько таблиц, правильно? Я не вижу ничего плохого, но Oracle говорит: «отсутствует или неверный параметр» в строке «CREATE TABLE Альбом»sql missing или invalid option for create table statement

CREATE TABLE Profile 
(prid INTEGER, 
first_name CHAR(20), 
last_name CHAR(20), 
year_of_birth INTEGER, 
month_of_birth CHAR(9), 
day_of_birth INTEGER, 
gender CHAR(6), 
PRIMARY KEY (prid)) 

CREATE TABLE Album 
(aid INTEGER, 
visible CHAR(20), 
link CHAR(30), 
create_time CHAR(30), 
mod_time CHAR(30), 
name CHAR(30), 
owner_prid INTEGER, 
PRIMARY KEY (aid), 
FOREIGN KEY owner_prid REFERENCES Profile(prid)) 
+0

в оракуле с «run» –

ответ

5

cyberkiwi уже ответил на ваш вопрос о синтаксической ошибке.

Поскольку вы новичок в SQL, я хотел бы прокомментировать сам DDL. В частности, похоже, что вы используете неправильные типы данных для ряда этих столбцов - это вернется, чтобы укусить вас.

  • Не следует использовать тип CHAR данных, если вы не имеете чрезвычайно веские причины, чтобы сделать это

Многие пользователи Oracle будут идти дальше и предположить, что вы никогда не использовать тип CHAR данных. Основная проблема с использованием CHAR заключается в том, что данные пустые. Поэтому, если вы храните слово «мужчина» в столбце GENDER, а GENDER - это CHAR (6), Oracle должен хранить два дополнительных пространства в конце строки. Это делает будущие операции сравнения очень опасными - вы должны убедиться, что используется семантика сравнения CHAR, а не семантика сравнения VARCHAR, и это имеет тенденцию становиться уродливым. Кроме того, вы теряете пространство на диске и в памяти, чтобы сохранить эти два дополнительных пространства без каких-либо преимуществ. Все ваши CHAR колонок должны быть действительно

  • даты Магазин VARCHAR2 в dates-- Не храните компоненты даты и не хранить даты как строки

Вместо хранения YEAR_OF_BIRTH, MONTH_OF_BIRTH, и DAY_OF_BIRTH, вы почти наверняка лучше с одним столбцом BIRTH_DATE типа DATE, где вы храните дату рождения. Вы всегда можете извлечь различные компоненты даты, если хотите узнать, в каком году родился человек. Однако хранение данных как DATE гарантирует, что сами компоненты даты действительны (т. Е. Нет опечаток, в которых месяц указан как «февраль», нет проблем с качеством данных, где месяц иногда «фев», иногда «февраль», а иногда «2», даты 30 февраля и т. д.). Хранение данных как DATE дает оптимизатору гораздо больше информации для работы, поэтому с большей вероятностью будет генерировать наиболее эффективный план, потому что он знает что-то о распределении данных. И вы можете использовать все различные функции даты, предоставляемые Oracle.

К тому же, так как CREATE_TIME и MOD_TIME являются датами (дата Oracle всегда есть день и компонент времени), вы должны хранить их в качестве даты (или Timestamps), а не VARCHAR2 лет. Это позволяет использовать функции даты (или временную метку), это гарантирует, что время действительно, оно устраняет проблемы с различными форматами, хранящимися в одном столбце, и это упрощает использование различных функций даты.

+0

+1 хороший совет для новичков! – DCookie

4

Если вы используете Oracle XE и интерфейс браузера, вы не можете запустить заявления многострочные. Разделите их на два оператора и запустите один, затем очистите текст, вставьте другой, затем запустите снова.

Ваш второй блок должен быть

CREATE TABLE Album 
(aid INTEGER, 
visible CHAR(20), 
link CHAR(30), 
create_time CHAR(30), 
mod_time CHAR(30), 
name CHAR(30), 
owner_prid INTEGER, 
PRIMARY KEY (aid), 
FOREIGN KEY (owner_prid) REFERENCES Profile(prid)) 

т.е. скобки вокруг поля, которое является составной частью FK

+0

Даже с кронштейнами ora-00902: недопустимый тип данных для меня на XE –

+0

Нет.Для меня не бывает. 'Таблица создана. 'Нет ключевого слова" CONSTRAINT " – RichardTheKiwi

+0

+1: Подтвержденное пропущенное" ограничение "работает с скобками. –

Смежные вопросы