PostgreSQL 列名区分大小写吗?

问题描述 投票:0回答:5

我有一个数据库表,Postgres 中的

persons
,由另一个团队传承下来,其列名称为
"first_Name"
。现在我尝试使用 PG Commander 来查询此列名称上的表。

select * from persons where first_Name="xyz";

它就回来了

错误:列“first_Name”不存在

不确定我是否做了一些愚蠢的事情,或者是否有解决方法来解决我所缺少的问题?

sql postgresql identifier case-sensitive case-insensitive
5个回答
470
投票

双引号中的标识符(包括列名)在 PostgreSQL 中会折叠为小写。使用 双引号 创建并因此保留大写字母(和/或其他语法违规)的列名称在其余生中必须用双引号引起来:

"first_Name" → "first_Name"  -- upper-case "N" preserved
"1st_Name"   → "1st_Name"    -- leading digit preserved
"AND"        → "AND"         -- reserved word preserved

但是:

first_Name   → first_name    -- upper-case "N" folded to lower-case "n"
1st_Name     → Syntax error! -- leading digit
AND          → Syntax error! -- reserved word

(字符串文字/常量)包含在 单引号中:

'xyz'

所以,是的,PostgreSQL 列名区分大小写(当用双引号引起来时):

SELECT * FROM persons WHERE "first_Name" = 'xyz';

标识符手册。

我的一贯建议是只使用合法的小写名称,因此不需要双引号。


27
投票

引用文档

关键字和不带引号的标识符不区分大小写。因此:

UPDATE MY_TABLE SET A = 5;

可以等效地写为:

uPDaTE my_TabLE SeT a = 5;

您也可以使用 带引号的标识符:

来编写它
UPDATE "my_table" SET "a" = 5;

引用标识符使其区分大小写,而未加引号的名称始终折叠为小写(与未加引号的名称折叠为大写的 SQL 标准不同)。例如,标识符

FOO
foo
"foo"
被 PostgreSQL 视为相同,但
"Foo"
"FOO"
这三个标识符不同,并且彼此不同。

如果您想编写可移植应用程序,建议您始终引用特定名称或从不引用它。


15
投票

PostgresQL 中混合大小写或大写的列名必须用双引号引起来。因此,最好的约定是在所有小写字母后面加上下划线。


3
投票

如果使用 JPA,我建议更改为小写模式、表和列名称,您可以使用以下说明来帮助您:

select
    psat.schemaname,
    psat.relname,
    pa.attname,
    psat.relid
from
    pg_catalog.pg_stat_all_tables psat,
    pg_catalog.pg_attribute pa
where
    psat.relid = pa.attrelid

更改架构名称:

ALTER SCHEMA "XXXXX" RENAME TO xxxxx;

更改表名称:

ALTER TABLE xxxxx."AAAAA" RENAME TO aaaaa;

更改列名称:

ALTER TABLE xxxxx.aaaaa RENAME COLUMN "CCCCC" TO ccccc;

1
投票

您可以尝试此示例,以大写字母命名表和列。 (postgresql)

//Sql;
      create table "Test"
        (
        "ID" integer,
        "NAME" varchar(255)
        )



//C#
  string sqlCommand = $@"create table ""TestTable"" (
                                ""ID"" integer GENERATED BY DEFAULT AS IDENTITY primary key, 
                                ""ExampleProperty"" boolean,
                                ""ColumnName"" varchar(255))";
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.