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以便执行更容易和更快速,但引用的表单也是正确的.
编辑:为什么解析器更容易?
解析器的问题更多在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