我有一个数据库表,Postgres 中的
persons
,由另一个团队传承下来,其列名称为 "first_Name"
。现在我尝试使用 PG Commander 来查询此列名称上的表。
select * from persons where first_Name="xyz";
它就回来了
错误:列“first_Name”不存在
不确定我是否做了一些愚蠢的事情,或者是否有解决方法来解决我所缺少的问题?
双引号中的标识符(包括列名)在 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';
我的一贯建议是只使用合法的小写名称,因此不需要双引号。
引用文档:
关键字和不带引号的标识符不区分大小写。因此:
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"
这三个标识符不同,并且彼此不同。
如果您想编写可移植应用程序,建议您始终引用特定名称或从不引用它。
PostgresQL 中混合大小写或大写的列名必须用双引号引起来。因此,最好的约定是在所有小写字母后面加上下划线。
如果使用 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;
您可以尝试此示例,以大写字母命名表和列。 (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))";