我似乎找不到描述 PostgreSQL 模式名称有效格式的文档。我知道架构名称不能:
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
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。
| 归档时间: |
|
| 查看次数: |
23433 次 |
| 最近记录: |