PostgreSQL 命名规范

303

我在哪里可以找到有关PostgreSQL命名约定的详细手册?(表名与驼峰式命名、序列、主键、约束、索引等...)


1
如果我们想深入了解通用命名约定,我强烈建议查看这个答案:https://dev59.com/am445IYBdhLWcg3wydBk#4703155 - vyegorov
3个回答

430

关于表名,大小写等方面的命名,普遍约定俗成的是:

  • SQL关键字:大写字母
  • 标识符(数据库、表、列的名称等):小写字母加下划线

例如

UPDATE my_table SET name = 5;
这并非铁规,但我个人强烈推荐将 标识符使用小写。PostgreSQL在未加引号的情况下不区分大小写处理标识符(实际上会在内部转换为小写),在加引号时则区分大小写;许多人并不知道这个特殊规定。始终使用小写是安全的。无论如何,可以使用 camelCase PascalCase (或 UPPER_CASE ),只要保持一致:始终引用标识符或从不引用(包括模式创建!)。

我不了解其他约定或样式指南。替代键通常由序列生成(通常使用serial 宏),如果手动创建,请使用该命名约定为这些序列指定名称(tablename_colname_seq)。

此外,请参阅一些讨论:此处此处以及(有关通用SQL)此处,所有这些都提供了几个相关链接。

注:PostgreSQL 10引入了identity列作为serial的符合SQL规范的替代品。


6
Pg有一个独特之处,就是将大小写折叠成小写,而SQL标准规定应该折叠成大写。不能折叠大小写的DBMS是奇怪的非标准软件。 - Craig Ringer
42
作为Postgres的新用户,这很令人沮丧。不得不在输入时选择经常打引号或者使用丑陋的命名规范,很糟糕。非常糟糕。 - d512
3
@user1334007 这种约定并不难看 - 请参考上面Craig的评论。如果你一开始创建表格时没有引用,那么现在也没有必要引用(也就是说,保持一致即可)。 - leonbloy
9
如果您在创建表格时不使用引号,Postgres会将表格名称和字段名称转换为小写。在编写查询时可以使用驼峰式命名法,但结果会显示全部小写字母,当字段由多个单词组成时(例如lastupdateddate)阅读起来很困难。如果您想让列名在查询结果中易于阅读,请使用引号引用所有内容或使用下划线式命名法。个人认为下划线式命名法不太美观,因此最好的方法是让Postgres保留名称并且不要求您提供引号。 - d512
23
我讨厌大写的关键词,非常讨厌,无论是惯例还是其他什么。 关键词不应该区分大小写。我更喜欢全部小写。是的,我知道这只是个人偏好,但这也只是一条评论。;-) - Craig Tullis
显示剩余3条评论

50

因为没有单一的风格或标准,所以实际上并没有正式的手册。

只要您了解标识符命名规则,您就可以使用任何想用的名称。

在实践中,我发现使用lower_case_underscore_separated_identifiers更容易,因为不需要到处使用"Double Quote"来保留大小写、空格等。

如果您想将表和函数命名为"@MyAṕṕ! ""betty"" Shard$42",您可以自由选择,尽管这样做会很麻烦。

需要理解的主要内容包括:

  • 除非使用双引号,否则标识符会被转换为小写字母,因此MyTableMYTABLEmytable都是相同的东西,但"MYTABLE""MyTable"是不同的;

  • 除非使用双引号:

    SQL标识符和关键字必须以字母(a-z,还包括带有变音符号和非拉丁字母的字母)或下划线(_)开头。标识符或关键字中的后续字符可以是字母、下划线、数字(0-9)或美元符号($)。

  • 如果您希望使用关键字作为标识符,则必须将其用双引号括起来。

实际上,我强烈建议您不要将关键字用作标识符。至少避免使用保留字。就因为您可以将表命名为"with"并不意味着您应该这样做。


1
感谢您链接到有关标识符命名规则的文档。我之前很难找到这个特定的主题。 - Basil Bourque
4
我觉得使用lower_case_underscore_separated_identifiers更容易......最近,我听到有人把它叫做“蛇形命名法”。 - bvj

2
这里唯一的两个答案都是6年前的,我不确定现在snake_case是否仍然是最好的情况。以下是我对现代情况的看法。此外,省略任何需要双引号的额外复杂性。我认为流程比试图避免小麻烦更重要。
考虑到没有严格的指南/样式指南,我认为最好使用与项目代码相同的大小写。例如,在像JavaScript这样的语言中使用OOP方法,表名将使用PascalCase,而属性将使用camelCase。如果您采用函数式方法,则它们都将是camelCase。此外,按照惯例,JS类是PascalCase,属性是camelCase,因此无论如何都是有意义的。
另一方面,如果您在Python中使用SqlAlchemy进行编码,则只有使用snake_case名称来衍生函数模型和使用PascalCase名称来衍生类模型才有意义。在这两种情况下,属性/列应该是snake_case。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接