在PostgreSQL的select查询中以表的名称双引号

时间:2014-08-10 07:17:59

标签: postgresql

我在PostgreSQL中运行以下简单的选择查询:

SELECT * FROM "INFORMATION_SCHEMA.KEY_COLUMN_USAGE"

它给了我以下错误报告:

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_SCHEMA.KEY_COLUMN_USAGE

再次,当我从我创建的表中选择时,情况就会逆转。一个失败后:

SELECT * FROM countryTable

跟随一个成功运行。

SELECT * FROM "countryTable"

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

2 个答案:

答案 0 :(得分:2)

你可能创建了你的表:

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)
);

然后您可以使用此查询已有SELECT * FROM countryTable

答案 1 :(得分:0)

虽然我个人的建议是专门使用合法的小写名称而不使用双引号,但本身并没有问题。

当您查看psql(\d tbl)中的表定义,或pg_class pg_attributes中的表名或quote_ident()中的列名或任何{ {3}}次观看,您可以获得正确拼写的标识符(以及可能通过双引号保留的所有其他奇怪内容)。您可以根据需要使用{{1}}自动引用这些名称 - 如果需要,它只会添加双引号。

Postgres本身并不愚蠢地使用CaMeL案例名称。信息模式或系统目录中的所有对象都是低级的(系统表和列的名称,不是它们作为数据携带的用户表的名称)。

从基础开始,阅读system catalog