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。我为没有房间类型和大小的房间制作桌子。

4

4 回答 4

7

SIZE是保留关键字。这意味着我们不能将其用作标识符(除非我们将其放在双引号中,但双引号标识符是 Teh Suck!所以不要这样做)。将列名更改为ROOMSIZE您的语句将运行

请注意,这TYPE也是一个关键字,但不是保留的。因此,我们可以将其用作列标识符。类型直到 8 才引入;制作TYPE保留关键字会破坏全世界 Oracle 应用程序中的代码,尤其是在其自己的数据字典中。

该文档包含保留字的完整列表。 在这里找到它


为什么使用"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 允许我们做我们不应该做的事情。不使用双引号标识符属于该类别。

于 2013-08-24T05:22:07.563 回答
2

大小是一个关键字,它不能用作列名,除非您将其与双引号一起使用。我的建议是为列使用其他名称作为 room_size。如果您出于某种原因仍想使用 SIZE 作为列名,则需要在创建表时使用双引号,并且在使用此列执行任何其他查询时也要注意这一点。

这是使用大小作为列名http://sqlfiddle.com/#!4/7e746的工作小提琴

我确实想补充(与上面相同),使用保留字作为列名(使用双引号)是一个坏主意。

于 2013-08-24T05:52:22.757 回答
1

您不能使用任何这些保留字作为标识符: http ://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_keywd.htm

尺寸在列表中。如果您为该列选择其他名称,您应该没问题。

于 2013-08-24T05:12:00.380 回答
0

SIZE是甲骨文的保留字!因此,不允许将它们用作变量或对象的名称。您可以在http://docs.oracle.com/cd/B28359_01/appdev.111/b31231/appb.htm找到Oracle 11g 的保留字列表。

这是第二个时刻,您可以在双引号中使用它,例如"SIZE"or "Size",但这会区分大小写,不推荐使用。

于 2013-08-24T14:21:54.223 回答