创建表的标识符无效
Posted
技术标签:
【中文标题】创建表的标识符无效【英文标题】:invalid identifier for creating table 【发布时间】:2013-08-24 05:09:50 【问题描述】:create table ROOM
(NO_ROOM INT PRIMARY KEY, TYPE VARCHAR2(8) NOT NULL, SIZE VARCHAR2(8) NOT NULL)
;
我得到 ORA-00904,我认为问题来自 NO_ROOM。我尝试使用NUMBER,它是一样的。
PS。我为没有房间类型和大小的房间制作桌子。
【问题讨论】:
SIZE
是保留字!因此,不允许将它们用作变量或字段的名称。你可以在这里找到docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm Oracle 11g 的保留字列表。
【参考方案1】:
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】:Size 是一个关键字,它不能用作列名,除非您将其与双引号一起使用。我的建议是为列使用其他名称作为 room_size。如果您出于某种原因仍想使用 SIZE 作为列名,则需要在创建表时使用双引号,并且在使用该列进行任何其他查询时也要注意这一点。
这是使用大小作为列名http://sqlfiddle.com/#!4/7e746的工作小提琴
我确实想补充(与上面相同)使用保留字作为列名(使用双引号)是一个坏主意。
【讨论】:
不要告诉人们使用双引号标识符。使用它们非常痛苦,在这种情况下没有必要使用它们。 @APC 我已经建议使用其他列名,例如 room_size。你为什么投了反对票? @APC rakeshjain 提出了如何做的建议。这取决于是否使用 OP。如果 OP 需要将列名设为 SIZE 该怎么办 @rakeshjain +1 暗示双引号的想法 @javaBeginner - 糟糕的建议就是糟糕的建议。在现实世界中,从来没有任何理由使用保留关键字作为列名。即使用户想在屏幕上看到Size,我们只需在前端设置一个显示标题。【参考方案3】:您不能使用以下任何保留字作为标识符: http://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_keywd.htm
尺寸在列表中。如果您为该列选择其他名称,您应该没问题。
【讨论】:
【参考方案4】:SIZE
是 Oracle 的保留字!因此,不允许将它们用作变量或对象的名称。您可以在这里找到http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm Oracle 11g 的保留字列表。
这是第二个时刻,你可以在"SIZE"
或"Size"
这样的双引号内使用它,但会区分大小写,不推荐。
【讨论】:
您认为您的回答究竟增加了什么?它只是概括了该线程中的其他答案。更好地利用您的时间是回答许多没有答案的 [oracle] 问题之一。 ***.com/questions/tagged/… 否则,您应该通过投票来表明您对现有答案的同意。以上是关于创建表的标识符无效的主要内容,如果未能解决你的问题,请参考以下文章