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

Ram*_*yag 15 postgresql

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

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

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

gsi*_*ems 21

根据精美的文档,我认为这可能是您正在寻找的。

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


efe*_*sar 6

正确答案是 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

    CREATE TABLE public."TBLUSER"
    (
      username text
    ) 
    WITH (
      OIDS = FALSE
    )
    ;
Run Code Online (Sandbox Code Playgroud)

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


Nat*_*n C 5

根据文档,它也不能开始,pg_因为它是保留的。除此之外,它看起来相当自由。

  • @Ramon:严格来说,_this-is_ 或 _this-is schema_ 是有效的模式名称。您似乎将**什么是有效的**与**何时必须引用**混淆。 (3认同)