在Postgresql中创建和访问以数值开头的架构

在Postgresql中创建和访问以数值开头的架构,postgresql,Postgresql,我为数据库中的每个新租户生成一个10个字符的字母数字随机字符串作为模式名称 在这个实例中,它生成了5ku2mug7m8作为字符串。在pic中正确创建了架构,但在访问架构时,出现错误 "ERROR: syntax error at or near "5" LINE 1: SELECT * FROM 5ku2mug7m8.tablename" 我认为这是由于前面的数字。我尝试用双引号将模式包装起来,但postgres不接受 我的问题是:如果我不能访问带有前导数字的模式,为什么postgres首先

我为数据库中的每个新租户生成一个10个字符的字母数字随机字符串作为模式名称

在这个实例中,它生成了5ku2mug7m8作为字符串。在pic中正确创建了架构,但在访问架构时,出现错误

"ERROR:  syntax error at or near "5"
LINE 1: SELECT * FROM 5ku2mug7m8.tablename"
我认为这是由于前面的数字。我尝试用双引号将模式包装起来,但postgres不接受

我的问题是:如果我不能访问带有前导数字的模式,为什么postgres首先允许创建它?现在我在DB中有一个无法访问的模式,除非它可以访问,而我只是错过了它

编辑:从文档中

SQL标识符和关键字必须以字母a-z开头,但也必须以字母a-z开头 带有变音符号和非拉丁字母或下划线的字母 _。标识符或关键字中的后续字符可以是 字母、下划线、数字0-9或美元符号$。注意 根据字母的规定,标识符中不允许使用美元符号 SQL标准,因此它们的使用可能会使应用程序更少 便携式

但是为什么一开始就允许创建没有任何错误的模式呢?好奇


如果架构名称使用双引号,则可以创建其名称以数字开头的架构

psql演示:

# select version();
                                                 version                        

--------------------------------------------------------------------------------
-------------------------
 PostgreSQL 12.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (R
ed Hat 4.8.5-39), 64-bit

# create schema "5ku";
CREATE SCHEMA

# create table "5ku".t(x int);
CREATE TABLE

# select * from "5ku".t;
 x 
---
(0 rows)

您可能使用pgAdmin创建了模式,该工具会自动为您添加双引号

您当然可以使用删除模式

DROP SCHEMA "5ku2mug7m8";
除非您在模式名称中有一些讨厌的东西,比如前导空格或尾随空格

您可以通过以下方法找到真正的架构名称:

SELECT quote_ident(nspname)
FROM pg_namespace
WHERE nspname LIKE '%5%';
您的经验和您对文档的研究是有价值的。您已经了解了为什么选择对象或列名“标识符”是个坏主意,因为它们是有效的SQL标识符,不需要双引号