PostgreSQL的select查询中表名中的双引号

PostgreSQL的select查询中表名中的双引号,postgresql,Postgresql,我正在PostgreSQL中运行以下简单的select查询: 从“信息\u架构.键\u列\u用法”中选择* 它向我提供了以下错误报告: ERROR: relation "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" does not exist LINE 1: SELECT * FROM "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" ^ ********** Error **********

我正在PostgreSQL中运行以下简单的select查询:

从“信息\u架构.键\u列\u用法”中选择*

它向我提供了以下错误报告:

ERROR:  relation "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" does not exist
LINE 1: SELECT * FROM "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"
                      ^
********** Error **********

ERROR: relation "INFORMATION_SCHEMA.KEY_COLUMN_USAGE" does not exist
SQL state: 42P01
Character: 15
但当我运行以下查询时,它会成功运行:

SELECT*FROM INFORMATION\u SCHEMA.KEY\u COLUMN\u用法

同样,当我从自己创建的表中选择时,情况正好相反。以下一项失败:

从countryTable中选择*

而下面一个运行成功

从“countryTable”中选择*


为什么会这样?问题是什么?

您可能创建了表,以便:

CREATE TABLE "countryTable" (
  id SERIAL NOT NULL,
  country TEXT NOT NULL,
  PRIMARY KEY(id)
);
如果要创建一个用
包装的表空间,通常不应在postgres中对表名或列使用双引号,请尝试不使用双引号:

CREATE TABLE countryTable (
  id SERIAL NOT NULL,
  country TEXT NOT NULL,
  PRIMARY KEY(id)
);

然后你就可以使用这个查询了,你已经从countryTable中选择了*

当您查看psql(
\d tbl
)中的表定义,或
pg_类中的表名,或
pg_属性中的列名,或任何视图时,都会得到拼写正确的标识符(以及通过双引号保留的所有其他异常)。您可以使用
quote_ident()
根据需要自动引用此类名称-仅在必要时添加双引号

Postgres本身并没有愚蠢到使用驼峰大小写名称。信息架构或系统目录中的所有对象都是小写的(系统表和列的名称,而不是它们作为数据携带的用户表的名称)


从基础开始,阅读。

假设我正在查询其他人创建的数据库。那么我怎么知道我是否需要添加双引号呢?如果他们是一家提供服务的公司,我可能会与他们交谈,并强调这是一种不好的做法,事实上,你现在的处境是,你不知道你是否应该使用双引号,唯一的方法是尝试和猜测,这可能不是这家公司想要的。如果是你可以访问的或是你公司内部的,我会备份数据库,将表名更改为标准格式,然后删除旧表并上传新表。简短的回答据我所知,如果你不尝试每一个表,那就没有办法知道了。双引号标识符区分大小写,非引号标识符折叠成小写(但标准规定它们应该折叠成大写)。您可以从
psql
\d tablename
查看列、表、。。。他们真的被称为。