我似乎找不到描述PostgreSQL模式名称的有效格式的文档。我知道架构名称不能:
- 以数字开头
- 有空间
- 从...开始
pg_
还有什么?我应该去哪里看?
我似乎找不到描述PostgreSQL模式名称的有效格式的文档。我知道架构名称不能:
pg_
还有什么?我应该去哪里看?
Answers:
根据文档,它也不能以pg_
保留开头。除此之外,它看起来相当自由。
正确的答案是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
。