加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 数据库 > MsSql > 正文

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

发布时间:2020-05-23 07:42:19 所属栏目:MsSql 来源:互联网
导读:我尝试创建名为15909434_user的表,其语法如下所示: CREATE TABLE 15909434_user ( ... ) 当然会产生错误.然后,在我试图用google进行一些研究之后,我发现一篇很好的文章here描述: When you create an object in PostgreSQL, you give that object a name. Ev

我尝试创建名为15909434_user的表,其语法如下所示:

CREATE TABLE 15909434_user ( ... )

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

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

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读