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 :(得分: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允许我们做一些我们不应该做的事情。不使用双引号标识符属于该类别。
答案 1 :(得分:2)
大小是一个关键字,除非您使用双引号,否则它不能用作列名。我的建议是将列的其他名称用作room_size。如果由于某种原因仍希望将SIZE用作列名,则在创建表时需要使用双引号,并在使用此列执行任何其他查询时也要使用双引号。
以下是用作列名http://sqlfiddle.com/#!4/7e746
的大小的工作小提琴我想添加(与上面相同)使用保留字作为列名(使用双引号)是一个坏主意。
答案 2 :(得分:1)
您不能将任何这些保留字用作标识符: http://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_keywd.htm
尺寸在列表中。如果您为该列选择其他名称,那么您应该没问题。
答案 3 :(得分:0)
SIZE
是Oracle的保留字!因此,不允许将它们用作变量或对象的名称。您可以在此处找到{11}的Oracle {11 {3}}保留字列表。
这是第二个时刻,您可以在"SIZE"
或"Size"
这样的双引号内使用它,但这样会区分大小写,不推荐使用。