为什么PostgreSQL不喜欢UPPERCASE表名?

Met*_*ani 8 postgresql

我最近尝试用大写名称在PostgreSQL中创建一些表.但是为了查询它们,我需要将表名放在"TABLE_NAME"中.有没有办法避免这种情况并告诉postgres正常使用大写名称?

UPDATE

此查询创建一个小写table_name的表

create table TABLE_NAME 
(
id integer,
name varchar(255)
)
Run Code Online (Sandbox Code Playgroud)

但是,此查询创建一个大写名称为"TABLE_NAME"的表

create table "TABLE_NAME"
(
id integer,
name varchar(255)
)
Run Code Online (Sandbox Code Playgroud)

问题是报价是现在名称的一部分!! 在我的情况下,我不手动创建表,另一个应用程序创建表,名称是大写字母.当我想通过Geoserver 使用CQL过滤器时,这会导致问题.

Vao*_*sun 16

如果希望postgres保留关系名称的大小写,请将表名放入双引号中.

引用标识符也会使其区分大小写,而不带引号的名称始终折叠为小写.例如,PostgreSQL认为标识符FOO,foo和"foo"是相同的,但是"Foo"和"FOO"与这三个和彼此不同.(在PostgreSQL中将不带引号的名称折叠为小写与SQL标准不兼容,后者表示不带引号的名称应该折叠成大写.因此,根据标准,foo应该等同于"FOO"而不是"foo".如果如果您想编写便携式应用程序,建议您始终引用特定名称或从不引用它.)

来自docs(强调我的)

引用示例:

t=# create table "UC_TNAME" (i int);
CREATE TABLE
t=# \dt+ UC

t=# \dt+ "UC_TNAME"
                      List of relations
 Schema |   Name   | Type  |  Owner   |  Size   | Description
--------+----------+-------+----------+---------+-------------
 public | UC_TNAME | table | postgres | 0 bytes |
(1 row)
Run Code Online (Sandbox Code Playgroud)

例子没有引用:

t=# create table UC_TNAME (i int);
CREATE TABLE
t=# \dt+ UC_TNAME
                      List of relations
 Schema |   Name   | Type  |  Owner   |  Size   | Description
--------+----------+-------+----------+---------+-------------
 public | uc_tname | table | postgres | 0 bytes |
(1 row)
Run Code Online (Sandbox Code Playgroud)

因此,如果您使用引号创建表,则不应跳过查询它的引号.但是如果你跳过创建对象的引号,名称将被折叠为小写,因此在查询中将使用大写名称 - 这样你就"不会注意到"它.


ant*_*ydb 6

问题意味着双引号,当用于强制PostgreSQL识别标识符名称的大小时,实际上成为标识符名称的一部分.那不对.如果您使用双引号强制套管,那么您必须始终使用双引号来引用该标识符.

背景:

在PostgreSQL中,除非用双引号括起标识符名称,否则标识符的名称总是折叠为小写.这可能会导致混淆.

考虑如果按顺序运行这两个语句会发生什么:

CREATE TABLE my_table (
    t_id serial,
    some_value text
);
Run Code Online (Sandbox Code Playgroud)

这会创建一个名为的表my_table.

现在,尝试运行:

CREATE TABLE My_Table (
    t_id serial,
    some_value text
);
Run Code Online (Sandbox Code Playgroud)

PostgreSQL忽略了大写(因为表名没有用引号括起来),并试图创建另一个表my_table.当发生这种情况时,它会抛出一个错误:

ERROR:  relation "my_table" already exists
Run Code Online (Sandbox Code Playgroud)

要使用大写字母创建表,您必须运行:

CREATE TABLE "My_Table" (
    t_id serial,
    some_value text
);
Run Code Online (Sandbox Code Playgroud)

现在,您的数据库中有两个表:

 Schema |           Name            | Type  |  Owner   
--------+---------------------------+-------+----------
 public | My_Table                  | table | postgres
 public | my_table                  | table | postgres
Run Code Online (Sandbox Code Playgroud)

唯一可以访问的方法My_Table是用双引号括住标识符名称,如下所示:

SELECT * FROM "My_Table"
Run Code Online (Sandbox Code Playgroud)

如果你保留标识符不加引号,那么PostgreSQL会把它折叠成小写并查询my_table.


小智 5

简而言之,Postgres 将(双引号)中的数据""视为区分大小写。并保留为小写。

示例:我们可以创建 2 列,其中包含名称 DETAILS 和详细信息,并在查询时:

select "DETAILS" 
Run Code Online (Sandbox Code Playgroud)

返回DETAILS列数据和

select details/DETAILS/Details/"details"
Run Code Online (Sandbox Code Playgroud)

返回详细信息列数据。