创建表的标识符无效

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/… 否则,您应该通过投票来表明您对现有答案的同意。

以上是关于创建表的标识符无效的主要内容,如果未能解决你的问题,请参考以下文章

记一例 ORA-00904:标识符无效

在动态表上获取“ORA00904:无效标识符”

Oracle SQL 创建视图无效标识符

SQL 错误:ORA-00904:创建表期间标识符无效

尝试创建表时 Oracle SQL “无效标识符错误”

无法使用外键创建表。错误:ORA-00904: : 无效标识符