表或列名称不能以数字开头?

时间:2013-04-10 04:39:19

标签: sql postgresql naming-conventions

我尝试使用如下语法创建名为15909434_user的表:

CREATE TABLE 15909434_user ( ... )

当然会产生错误。然后,在我尝试与谷歌进行一些研究之后,我找到了一篇好文章here来描述:

  

在PostgreSQL中创建对象时,为该对象指定名称。每个表都有一个名称,每列都有一个名称,依此类推。 PostgreSQL使用单一数据类型来定义所有对象名称:name类型。

     

类型name的值是63个或更少字符的字符串。名称必须以字母或下划线开头;字符串的其余部分可以包含字母,数字和下划线。

     

...

     

如果您发现需要创建不符合这些规则的对象,则可以用双引号将名称括起来。在引号中包含名称会创建带引号的标识符。例如,您可以创建一个名为“3.14159”的表 - 双引号是必需的,但实际上并不是名称的一部分(也就是说,它们不会被存储,也不会计入63-人物限制)。 ...

好的,现在我知道如何通过使用这种语法解决这个问题(在表名上加上双引号):

CREATE TABLE "15909434_user" ( ... )

您可以创建表名或列名,例如"15909434_user"user_15909434,但不能使用数字创建表名或列名,而不使用双引号。

那么,我很好奇背后的原因(除了它是一个惯例)。为何适用此惯例?是为了避免语法限制或其他原因吗?

提前感谢您的关注!

2 个答案:

答案 0 :(得分:22)

它来自原始的sql标准,它通过几层间接最终到达标识符开始块,这是几个方面之一,但主要是“一个简单的拉丁字母”。还可以使用其他内容,但是如果您想查看所有详细信息,请转到http://en.wikipedia.org/wiki/SQL-92并按照指向实际标准的链接(第85页)

使用非数字标识符引入程序会使编写解析器来解码sql以便更容易和更快地执行,但引用的表单也可以。


编辑:为什么解析器更容易?

解析器的问题在SELECT - list子句中比FROM子句更多。 select-list是从表中选择的表达式列表,这非常灵活,允许使用简单的列名和数字表达式。请考虑以下事项:

SELECT 2e2 + 3.4 FROM ...

如果表名和列名可以以数字开头,则2e2列名称或有效数字(e格式通常在数字文字中允许)并且3.4表格“3”和“4”列或是数字值3.4

具有标识符的规则以简单的拉丁字母(以及其他一些特定事物)开头意味着看到2e2的解析器可以快速辨别出这将是一个数字表达式,同样的交易与3.4

虽然可以设计一个允许数字前导字符的方案,但这可能会导致更加模糊的规则(意见),因此这个规则是一个很好的解决方案。如果您先允许数字,那么它总是需要引用,这可能不是“干净”。


  

免责声明,我稍微简化了上述内容,忽略了核心化名称以保持简短。我对postgres并不完全熟悉,但是对Oracle RDB文档和sql规范进行了双重检查以上的答案

答案 1 :(得分:6)

我想象它与语法有关。

SELECT 24*DAY_NUMBER as X from MY_TABLE

很好,但如果允许24作为列名,则不明确。

添加引号意味着您明确引用标识符而不是常量。所以为了使用它,无论如何你总是要逃避它。