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

前端之家收集整理的这篇文章主要介绍了sql – 表或列名不能以数字开头?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我尝试创建名为15909434_user的表,其语法如下所示:
CREATE TABLE 15909434_user ( ... )

当然会产生错误.然后,在我试图用google进行一些研究之后,我发现一篇很好的文章@L_502_0@描述:

When you create an object in Postgresql,you give that object a name. Every table has a name,every column has a name,and so on. Postgresql uses a single data type to define all object names: the name type.

A value of type name is a string of 63 or fewer characters. A name must start with a letter or an underscore; the rest of the string can contain letters,digits,and underscores.

If you find that you need to create an object that does not meet these rules,you can enclose the name in double quotes. Wrapping a name in quotes creates a quoted identifier. For example,you could create a table whose name is “3.14159“—the double quotes are required,but are not actually a part of the name (that is,they are not stored and do not count against the 63-character limit). …

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

CREATE TABLE "15909434_user" ( ... )

您可以创建表或列名称,例如“15909434_user”和user_15909434,但是不能使用数字创建表或列名称,而不使用双引号.

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

提前感谢您的关注!

解决方法

它来自原来的sql标准,通过几层间接最终得到一个标识符开始块,这是几个事情之一,但主要是“一个简单的拉丁字母”.还有其他的东西也可以使用,但如果你想查看所有的细节,请到 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

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

Disclaimer,I’ve simplified the above slightly,ignoring corelation names to keep it short. I’m not totally familiar with postgres,but have double checked the above answer against Oracle RDB documentation and sql spec

猜你在找的MsSQL相关文章