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

2024-05-01

我尝试创建名为15909434_user语法如下:

CREATE TABLE 15909434_user ( ... )

这当然会产生错误。然后,在我尝试用谷歌进行一些研究后,我发现了一篇很好的文章here http://www.informit.com/articles/article.aspx?p=409471描述:

当您在 PostgreSQL 中创建对象时,您需要为该对象指定一个名称。每个表都有一个名称,每个列都有一个名称,等等。 PostgreSQL 使用单一数据类型来定义所有对象名称:name type.

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

...

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

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

CREATE TABLE "15909434_user" ( ... )

您可以创建表或列名称,例如"15909434_user"并且user_15909434,但无法创建以数字开头而不使用双引号的表或列名称。

那么,我很好奇其背后的原因(除非这是一个约定)。为什么要应用这个约定?是为了避免语法限制还是其他原因?

预先感谢您的关注!


它来自于原始的sql标准,经过几层间接最终得到一个标识符开始块,这是几件事之一,但主要是“一个简单的拉丁字母”。还有其他东西可以使用,但是如果您想查看所有详细信息,请访问http://en.wikipedia.org/wiki/SQL-92 http://en.wikipedia.org/wiki/SQL-92并点击实际标准的链接(第 85 页)

使用非数字标识符引入符可以使编写解析器来解码 sql 以便更轻松、更快速地执行,但带引号的形式也可以。


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

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

SELECT 2e2 + 3.4 FROM ...

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

有这样的规则身份标识以简单的拉丁字母(以及其他一些特定的东西)开头意味着解析器看到2e2可以很快看出这将是一个数值表达式,同样处理3.4

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


免责声明,我稍微简化了上面的内容,忽略了相关名称以保持简短。我对 postgres 并不完全熟悉,但已经根据 Oracle RDB 文档和 sql 规范仔细检查了上面的答案

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表名或列名不能以数字开头? 的相关文章

随机推荐