用于创建表的无效标识符

时间:2013-08-24 05:09:51

标签: sql database oracle

create table ROOM

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

;

我得到ORA-00904,我认为问题来自NO_ROOM。我尝试使用NUMBER,它是一样的。

PS。我为没有房间类型和大小的房间做桌子。

4 个答案:

答案 0 :(得分:7)

SIZE是保留关键字。这意味着我们不能将它用作标识符(除非我们将它放在双引号中,但是double-quoted identifiers are Teh Suck!所以不要这样做)。将列名更改为ROOMSIZEyour 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"这样的双引号内使用它,但这样会区分大小写,不推荐使用。