我尝试使用如下语法创建名为15909434_user
的表:
CREATE TABLE 15909434_user ( ... )
当然会产生错误。然后,在我尝试与谷歌进行一些研究之后,我找到了一篇好文章here来描述:
在PostgreSQL中创建对象时,为该对象指定名称。每个表都有一个名称,每列都有一个名称,依此类推。 PostgreSQL使用单一数据类型来定义所有对象名称:
name
类型。类型
name
的值是63个或更少字符的字符串。名称必须以字母或下划线开头;字符串的其余部分可以包含字母,数字和下划线。...
如果您发现需要创建不符合这些规则的对象,则可以用双引号将名称括起来。在引号中包含名称会创建带引号的标识符。例如,您可以创建一个名为“
3.14159
”的表 - 双引号是必需的,但实际上并不是名称的一部分(也就是说,它们不会被存储,也不会计入63-人物限制)。 ...
好的,现在我知道如何通过使用这种语法解决这个问题(在表名上加上双引号):
CREATE TABLE "15909434_user" ( ... )
您可以创建表名或列名,例如"15909434_user"
和user_15909434
,但不能使用数字创建表名或列名,而不使用双引号。
那么,我很好奇背后的原因(除了它是一个惯例)。为何适用此惯例?是为了避免语法限制或其他原因吗?
提前感谢您的关注!
答案 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作为列名,则不明确。
添加引号意味着您明确引用标识符而不是常量。所以为了使用它,无论如何你总是要逃避它。