PostgreSQL模式名称的有效格式是什么?


14

我似乎找不到描述PostgreSQL模式名称的有效格式的文档。我知道架构名称不能:

  • 以数字开头
  • 有空间
  • 从...开始 pg_

还有什么?我应该去哪里看?

Answers:


17

根据优良的文档,我认为这可能是您想要的。

SQL标识符和关键字必须以字母(az,但带有变音符号和非拉丁字母的字母)或下划线(_)开头。标识符或关键字中的后续字符可以是字母,下划线,数字(0-9)或美元符号($)。请注意,根据SQL标准字母,不允许在标识符中使用美元符号,因此使用美元符号可能会使应用程序的可移植性降低。


谢谢。我将按照以下说明进行操作,看看它们是否为有效的架构名称。如果是这样,那我会接受的。

可能想在pg_该链接上添加下划线,例如Nathan C所提到的
拉蒙·塔亚格

5

根据文档,它也不能以pg_保留开头。除此之外,它看起来相当自由。


谢谢,我将其添加到无法命名的架构列表中。不幸的是,显然这并不是唯一的规则。我可以命名this-is schema,它仍然是无效的架构名称。

3
@Ramon:严格地说,“ this-is”或“ this-is”架构是有效的架构名称。你似乎是混乱的是啥时,则必须使用引号
DanielVérité13年

是的,你可能是对的。让我看看这个。
拉蒙·塔亚格

3

正确的答案是gsiems提供的答案。但是,我想指出的是,PostgreSQL对带引号的标识符有一些规则,您可能需要牢记。“带引号的标识符可以包含任何字符,但代号为零的字符除外。(要包含双引号,请写两个双引号。)” ...您可能要查看的情况也有一些限制。

因此,如果要引用标识符,则可以使用所需的任何字符(\ 0除外)。但是,如果您不引用标识符,则必须遵循该页面上概述的规则。

我想指出这一点,主要是因为它以前曾被我咬过,尤其是有关未引用标识符中的大小写的规则(以及模式名称算作标识符)。

更新:

作为示例(不适用于模式标识符,但同样适用于它们):

    DROP TABLE "tbluser"; -- assuming it exists
    DROP TABLE "TBLUSER"; -- assuming it exists; incidentally, they are two different tables
    CREATE TABLE "TBLUSER" ( username text ); 
    INSERT INTO "TBLUSER" VALUES ( 'joe' ); 
    SELECT * FROM TBLUSER; -- this returns an error that the tbluser relation does not exist
    SELECT * FROM "TBLUSER"; -- works fine

对于那些熟悉PostgreSQL(也许还有SQL标准)的人来说,这可能是预期的行为,但是对于PG刚接触并且从其他数据库服务器(例如SQL Server或Oracle)的角度来看的人可能会遇到这种情况,并且想知道为什么他们刚创建的表丢失了。

也许有些手册建议不要使用带引号的标识符,但是事实是,带引号的标识符可供使用并且可以使用,此外,许多软件包都将在创建和访问非引用关系时始终使用带引号的标识符作为一项策略。完全小写,例如PGAdmin III。

例如,以下是PGAdmin III通过UI创建表时生成的脚本:

    CREATE TABLE public."TBLUSER"
    (
      username text
    ) 
    WITH (
      OIDS = FALSE
    )
    ;

因此,用户可以在查询中访问该表的唯一方法是引用其引用的标识符,即"TBLUSER"。尝试在查询中使用不带引号的标识符访问此表将导致无法找到该关系,即TBLUSER


评论不作进一步讨论;此对话已转移至聊天
保罗·怀特9
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.