我在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"
为什么会这样?有什么问题?
答案 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。