2013-08-24 15 views
0
create table ROOM 

(NO_ROOM INT PRIMARY KEY, TYPE VARCHAR2(8) NOT NULL, SIZE VARCHAR2(8) NOT NULL) 

; 

Я получаю ORA-00904, я думаю, проблема от NO_ROOM. Я пытаюсь использовать NUMBER, это то же самое.неверный идентификатор для создания таблицы

PS. Я делаю стол для комнаты, у которого нет типа и размера.

+0

'SIZE' зарезервированное слово! Таким образом, им не разрешено использовать их как имя переменных или полей. Вы можете найти здесь http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm список зарезервированных слов для Oracle 11g. – RustamIS

ответ

7

SIZE - зарезервированное ключевое слово. Это означает, что мы не можем использовать его как идентификатор (если мы не поместим его в двойные кавычки, но double-quoted identifiers are Teh Suck!, так что не делайте этого). Измените имя столбца на ROOMSIZE и your statement will run.

Отметьте, что TYPE также является ключевым словом, но не зарезервировано. Таким образом, нам разрешено использовать его как идентификатор столбца. Типы не вводились до 8; сделав TYPE зарезервированное ключевое слово сломало бы код в приложениях Oracle во всем мире, не в последнюю очередь в его собственном словаре данных.

В документации имеется полный список зарезервированных слов. Find it here.


Зачем использовать "SIZE" быть такой плохой идеей? В конце концов, как говорит @JavaBeginner, стандарт SQL это разрешает.

Как только мы решили использовать двойные кавычки, чтобы обойти правила именования Oracle, мы осуждены использовать их всякий раз, когда ссылается на столбец. Следовательно, это не будет являться действительным запрос:

select no_room, size 
from room 
where size > 10 

Мы должны написать вместо:

select no_room, "SIZE" 
from room 
where "SIZE" > 10 

И он всегда должен быть "SIZE": "size" является другой идентификатор. так и "Size".

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

2

Размер - это ключевое слово, и оно не может использоваться как имя столбца, если вы не используете его с двойными кавычками. Мое предложение - использовать другое имя для столбца как room_size. Если вы по-прежнему хотите использовать SIZE как имя столбца по какой-либо причине, вам придется использовать двойные кавычки при создании таблицы, а также позаботиться об этом, выполняя любые другие запросы, используя этот столбец.

Здесь работает скрипка с размером, используемым в качестве имени столбца http://sqlfiddle.com/#!4/7e746

Я хочу добавить (так же, как описано выше), что, используя зарезервированное слово для имени столбца (используя двойные кавычки) является плохой идеей.

+2

Не говорите людям использовать двойные кавычки. У них полная боль для работы, и нет необходимости использовать их в этой ситуации. – APC

+0

@APC Я уже предложил использовать другое имя столбца, например room_size. Почему вы проголосовали за это? – rakeshjain

+0

@APC rakeshjain сделал предложение, как это сделать. Это зависит от использования OP или нет. Что делать, если OP должно иметь название столбца как SIZE – SpringLearner

0

SIZE является зарезервированным словом Oracle! Таким образом, им не разрешено использовать их в качестве имени переменных или объектов. Вы можете найти здесь http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm список зарезервированных слов для Oracle 11g.

Это второй момент, вы можете использовать его внутри двойной цитаты, как "SIZE" или "Size", но это будет чувствительным к регистру и не рекомендуется.

+0

Как вы думаете, что ваш ответ добавляет? Он просто повторяет другие ответы в этой теме. Лучше использовать ваше время, чтобы ответить на один из многих вопросов оракула, у которых нет ответов. http://stackoverflow.com/questions/tagged/oracle?sort=unanswered&pagesize=30 В противном случае вы должны показать свое согласие с существующими ответами, выполнив их. – APC

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