Way*_*oga 15 sql postgresql naming-conventions
我试图创建15909434_user用以下语法命名的表:
CREATE TABLE 15909434_user ( ... )
Run Code Online (Sandbox Code Playgroud)
它当然会产生错误.然后,在我尝试与谷歌进行一些研究后,我在这里找到了一篇很好的文章描述:
在PostgreSQL中创建对象时,为该对象指定名称.每个表都有一个名称,每列都有一个名称,依此类推.PostgreSQL使用单一数据类型来定义所有对象名称:
name类型.type的值
name是63个或更少字符的字符串.名称必须以字母或下划线开头; 字符串的其余部分可以包含字母,数字和下划线....
如果您发现需要创建不符合这些规则的对象,则可以将该名称括在双引号中.在引号中包含名称会创建带引号的标识符.例如,您可以创建一个名称为"
3.14159"的表- 双引号是必需的,但实际上并不是名称的一部分(即,它们不存储且不计入63个字符的限制)....
好的,现在我知道如何通过使用这种语法解决这个问题(在表名上加上双引号):
CREATE TABLE "15909434_user" ( ... )
Run Code Online (Sandbox Code Playgroud)
您可以创建表或列名称,例如"15909434_user",也user_15909434可以创建表或列名称,以数字开头而不使用双引号.
那么,我很好奇背后的原因(除了它是一个惯例).为何适用此惯例?它是为了避免语法限制或其他原因吗?
提前感谢您的关注!
rlb*_*rlb 23
它来自原始的sql标准,它通过几层间接最终得到一个标识符起始块,这是几件事之一,但主要是它是"一个简单的拉丁字母".还有其他一些东西可供使用,但如果您想查看所有细节,请访问http://en.wikipedia.org/wiki/SQL-92并按照指向实际标准的链接(第85页)
使用非数字标识符引入程序会使编写解析器来解码sql以便更容易和更快地执行,但引用的表单也可以.
解析器的问题在SELECT-list子句中比在FROM子句中更多.select-list是从表中选择的表达式列表,这非常灵活,允许使用简单的列名和数字表达式.考虑以下:
SELECT 2e2 + 3.4 FROM ...
Run Code Online (Sandbox Code Playgroud)
如果表名和列名可以以数字开头,则2e2是列名或有效数字(e格式通常在数字文字中允许),是3.4表" 3"和列" 4"还是数值3.4?
具有标识符以简单拉丁字母(以及一些其他特定事物)开头的规则意味着看到的解析器2e2可以快速辨别出这将是一个数字表达式,同样处理3.4
虽然可以设计一个允许数字前导字符的方案,但这可能会导致更加模糊的规则(意见),所以这个规则是一个很好的解决方案.如果您先允许数字,那么它总是需要引用,这可能不是"干净".
免责声明,我已经略微简化了上述内容,忽略了核心化名称以保持简短.我对postgres并不完全熟悉,但是对Oracle RDB文档和sql规范进行了双重检查
我想这与语法有关.
SELECT 24*DAY_NUMBER as X from MY_TABLE
很好,但如果允许24作为列名,则不明确.
添加引号意味着您明确指的是标识符而不是常量.所以为了使用它,无论如何你总是要逃避它.
| 归档时间: |
|
| 查看次数: |
53603 次 |
| 最近记录: |