为什么PostgreSQL不喜欢大写的表名?

为什么PostgreSQL不喜欢大写的表名?,postgresql,Postgresql,我最近尝试在PostgreSQL中创建一些表,所有表的名称都是大写的。但是,为了查询它们,我需要将表名放在“table_name”中。有没有办法避免这种情况,让博士后像往常一样使用大写字母 更新 此查询使用小写的表名创建表 但是,此查询创建了一个大写名称为“table_name”的表 问题是这些引语现在已经成为名字的一部分了!! 在我的例子中,我不手动创建表,另一个应用程序创建表,名称用大写字母表示。当我想通过Geoserver使用过滤器时,这会导致问题。如果希望postgres保留关系名称的大

我最近尝试在PostgreSQL中创建一些表,所有表的名称都是大写的。但是,为了查询它们,我需要将表名放在“table_name”中。有没有办法避免这种情况,让博士后像往常一样使用大写字母

更新

此查询使用小写的表名创建表

但是,此查询创建了一个大写名称为“table_name”的表

问题是这些引语现在已经成为名字的一部分了!!
在我的例子中,我不手动创建表,另一个应用程序创建表,名称用大写字母表示。当我想通过Geoserver使用过滤器时,这会导致问题。

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

引用标识符也使其区分大小写,而不加引号 名称始终折叠为小写。例如,标识符 PostgreSQL认为FOO、FOO和“FOO”是相同的,但“FOO” “FOO”和“FOO”这三个词是不同的,而且彼此之间也是不同的。(折叠 在PostgreSQL中,将不带引号的名称改为小写与 SQL标准,该标准规定,不带引号的名称应折叠为大写 因此,根据 标准。如果你想编写便携应用程序,你是 建议始终引用某个特定名称,或永远不要引用该名称

来自(我的)

引用的示例:

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)
未引用的示例:

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)

所以,若您创建了带引号的表,就不应该跳过引号来查询它。但是,如果您跳过了创建对象的引号,则名称会被折叠为小写,查询中的大写名称也会被折叠为小写-这样您“不会注意到”它。

这个问题意味着,当使用双引号强制PostgreSQL识别标识符名称的大小写时,双引号实际上会成为标识符名称的一部分。那是不对的。实际情况是,如果使用双引号强制使用大小写,则必须始终使用双引号引用该标识符

背景:

在PostgreSQL中,标识符的名称总是折叠为小写,除非您用双引号将标识符名称括起来。这可能导致混乱

考虑一下如果按顺序运行这两条语句会发生什么情况:

CREATE TABLE my_table (
    t_id serial,
    some_value text
);
这将创建一个名为
my_table
的表

现在,尝试运行以下命令:

CREATE TABLE My_Table (
    t_id serial,
    some_value text
);
PostgreSQL忽略大写字母(因为表名没有引号),并尝试创建另一个名为
my\u table
的表。发生这种情况时,会抛出一个错误:

ERROR:  relation "my_table" already exists
要使用大写字母创建表格,必须运行:

CREATE TABLE "My_Table" (
    t_id serial,
    some_value text
);
现在数据库中有两个表:

 Schema |           Name            | Type  |  Owner   
--------+---------------------------+-------+----------
 public | My_Table                  | table | postgres
 public | my_table                  | table | postgres
访问My_表的唯一方法是用双引号将标识符名称括起来,如下所示:

SELECT * FROM "My_Table"

如果标识符不带引号,则PostgreSQL会将其折叠为小写,并查询
my_table

,简单地说,Postgres将(双引号)
中的数据视为区分大小写。并保留为小写

示例:我们可以创建名称为DETAILS和DETAILS的两列,在查询时:

select "DETAILS" 
返回
详细信息
列数据和

select details/DETAILS/Details/"details"

返回详细列数据。

您没有完全解释它。所以当他用大写字母创建时,它卡住了,但当他用大写字母查询时,它变为小写字母,不起作用。是吗?我引用了文档,它们说“建议您始终引用某个特定的名称,或者永远不要引用它。”我认为这意味着“当您创建不带引号的表时,无论何种情况,您都可以选择不带引号的表。如果您的表是用引号创建的,请在查询时使用引号”。或者你说了一些不同的话?但是OP不应该用大写或小写来访问他的表吗?我想他一定是用引号创建了这个表,不是吗?他应该用引号。我相信他可以访问,但不喜欢这样的事实,他需要在表名周围加引号,并询问他是否可以跳过引号,仅使用大写。请向我们展示您的
CREATE TABLE
语句。HTHW有一个非常详细的解释,基本上意味着postgres中的所有查询都默认转换为小写字母。但是,如果要创建大写字母的列,则必须在“”中指定它。和获取的数据在大写列(详细信息)中,您需要在(双引号)“”中指定列名。因此postgres将引号中的数据视为区分大小写的,并给出预期的列(详细信息)值。
select "DETAILS" 
select details/DETAILS/Details/"details"