我最近尝试使用大写名称在PostgreSQL中创建一些表。但是为了查询它们,我需要将表名放在“TABLE_NAME”中。有没有办法避免这种情况并告诉postgres正常使用大写名称?
更新
此查询创建一个小写 table_name
的表格create table TABLE_NAME
(
id integer,
name varchar(255)
)
但是,此查询会创建一个大写名称 “TABLE_NAME”
的表格create table "TABLE_NAME"
(
id integer,
name varchar(255)
)
问题是引用现在是名称的一部分!! 在我的情况下,我不手动创建表,另一个应用程序创建表,名称是大写字母。当我想通过Geoserver使用CQL过滤器时,这会导致问题。
答案 0 :(得分:11)
如果希望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)
示例没有引用:
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)
因此,如果您使用引号创建表,则不应跳过查询它的引号。但是如果你跳过创建对象的引号,名称将被折叠为小写,因此在查询中将使用大写名称 - 这样你就“不会注意到它”。
答案 1 :(得分:5)
这个问题意味着双引号,当用于强制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_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_Table
的唯一方法是用双引号括住标识符名称,如:
SELECT * FROM "My_Table"
如果你不加引号,那么PostgreSQL会把它折叠成小写并查询my_table
。
答案 2 :(得分:0)
简而言之,Postgres将""
(双引号)中的数据区分大小写。并保留为小写字母。
示例:我们可以在查询时创建名称为DETAILS和详细信息的2列。
select "DETAILS"
返回DETAILS
列数据和
select details/DETAILS/Details/"details"
返回详细信息列数据。