Ошибка SQL: ORA-00922: отсутствует или недействительна опция - PullRequest
2 голосов
/ 07 декабря 2011
CREATE TABLE chartered flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

Не следует ли использовать тип данных CHAR?

Я слышал, что это плохая практика, но я хотел сделать так, чтобы takeoff_at и destination имели минимум 3 символа, потому что это коды аэропортов.

Это ошибка, которую я получаю:

Error at Command Line:1 Column:23
Error report:
SQL Error: ORA-00922: missing or invalid option
00922. 00000 -  "missing or invalid option"
*Cause:    
*Action:

Ответы [ 3 ]

5 голосов
/ 07 декабря 2011

Ошибка, которую вы получаете, по-видимому, является результатом того, что в названии таблицы нет подчеркивания между "зафрахтованным" и "рейсом".Я предполагаю, что вы хотите что-то вроде этого, где имя таблицы chartered_flight.

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL
, destination CHAR (3) NOT NULL)

Как правило, нет смысла объявлять столбец как CHAR(3), а не VARCHAR2(3).Объявление столбца как CHAR(3) не означает наличия трех символов (полезных) данных.Он просто сообщает Oracle, что данные с пробелами должны содержать от трех до трех символов.Это вряд ли будет полезно, если кто-то случайно введет неправильный код.Потенциально вы можете объявить столбец как VARCHAR2(3), а затем добавить ограничение CHECK, которое LENGTH(takeoff_at) = 3.

CREATE TABLE chartered_flight(flight_no NUMBER(4) PRIMARY KEY
, customer_id NUMBER(6) REFERENCES customer(customer_id)
, aircraft_no NUMBER(4) REFERENCES aircraft(aircraft_no)
, flight_type VARCHAR2 (12)
, flight_date DATE NOT NULL
, flight_time INTERVAL DAY TO SECOND NOT NULL
, takeoff_at CHAR (3) NOT NULL CHECK( length( takeoff_at ) = 3 )
, destination CHAR (3) NOT NULL CHECK( length( destination ) = 3 )
)

Поскольку takeoff_at и destination являются кодами аэропортов, вам действительно следуетиметь отдельную таблицу действительных кодов аэропортов и определить ограничения внешнего ключа между таблицей chartered_flight и этой новой таблицей airport_code.Это гарантирует, что будут добавлены только действительные коды аэропортов, и в будущем будет намного проще, если код аэропорта изменится.

И с точки зрения соглашения об именах, так как takeoff_at и destination являются кодами аэропортов,предложил бы, чтобы имена были дополнительными и указывали на этот факт.Например, что-то вроде departure_airport_code и arrival_airport_code будет гораздо более значимым.

2 голосов
/ 07 декабря 2011

Вы не должны использовать символ пробела при именовании объектов базы данных.Хотя это возможно при использовании двойных кавычек (идентификаторов в кавычках), CREATE TABLE "chartered flight" ..., это не рекомендуется.Присмотритесь здесь

1 голос
/ 07 декабря 2011

нет ничего плохого в том, чтобы использовать CHAR как этот ... Я думаю, что ваша проблема в том, что у вас есть пробел в имени таблицы.Должно быть: charteredflight или chartered_flight ..

...