SQL отсутствует или недопустимый параметр при создании таблицы оператора - PullRequest
1 голос
/ 28 января 2011

Я новичок в SQL, этот сегмент должен просто составить несколько таблиц, верно?Я не вижу ничего плохого, но Oracle говорит "отсутствует или недопустим вариант" в строке "CREATE TABLE Album"

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))

Ответы [ 2 ]

5 голосов
/ 28 января 2011

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

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

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

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

  • Хранить даты как даты - не хранить компоненты даты и не хранить даты как строки

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

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

4 голосов
/ 28 января 2011

Если вы используете 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))

, то есть заключить в квадратные скобки поле, которое является частьюФК

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