Postgresql表存在,但查询时获取“关系不存在”


83

我有一个带有许多表的postgresql数据库。如果我查询:

SELECT column_name
FROM information_schema.columns
WHERE table_name="my_table";

我将获得正确返回的列的列表。

但是,当我查询:

SELECT *
FROM "my_table";

我得到错误:

(ProgrammingError) relation "my_table" does not exist
'SELECT *\n    FROM "my_table"\n' {}

关于为什么我可以获取列但无法查询表的任何想法?目标是能够查询表。


你可以用另一张桌子做同样的事情吗?尝试创建一个新的。
Juan Carlos Oropeza

2
您显示的查询无效。WHERE table_name="my_table";无效,因为"my_table"引用了列名,并且中没有这样的列information_schema.columns。请编辑您的问题,并添加用于创建表格的确切 create table语句。
a_horse_with_no_name

Answers:


93

如果不是公共模式,则必须包括模式

SELECT *
FROM <schema>."my_table"

或者您可以更改默认架构

SHOW search_path;
SET search_path TO my_schema;

在这里检查您的表架构

SELECT *
FROM information_schema.columns

在此处输入图片说明

例如,如果表位于默认架构上,则public两者都可以正常运行

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

但是部门需要指定架构

SELECT * FROM map_update.sectores_point

2
正确答案。如果不熟悉SQL标准的“群集”>“目录”>“架构”>“表”的层次结构,请参阅问题,关系数据库中的目录和架构有什么区别?还有我的图
罗勒·布尔克

是的-做到了,非常感谢。当然,我现在知道了permission denied,但是至少我知道该去哪里。
patkil '16

4
对于以后使用该线程的读者,也可能发生此错误,就像在我的情况下一样,当模式名称和表名称包含大小写混合的字符且未在双引号中单独引起时。换句话说,必须将其指定为:“ my_Schema”。“ my_Table”
Snidhi Sofpro

1
@SnidhiSofpro字段名称也会发生这种情况,我的建议是使用小写字母名称,因此您不必添加双引号的麻烦。
Juan Carlos Oropeza

1
如果一切都可以SET search_path TO my_schema;在postgres shell中使用,但确切的内容在python代码中无法使用怎么办?我没有任何区分大小写的问题。我确定!
Alex Jolig


10

我必须在表名中加上双引号。

db=> \d
                           List of relations
 Schema |                     Name                      | Type  | Owner 
--------+-----------------------------------------------+-------+-------
 public | COMMONDATA_NWCG_AGENCIES                      | table | dan
 ...

db=> \d COMMONDATA_NWCG_AGENCIES
Did not find any relation named "COMMONDATA_NWCG_AGENCIES".

???

双引号:

db=> \d "COMMONDATA_NWCG_AGENCIES"
                         Table "public.COMMONDATA_NWCG_AGENCIES"
          Column          |            Type             | Collation | Nullable | Default 
--------------------------+-----------------------------+-----------+----------+---------
 ID                       | integer                     |           | not null | 
 ...

很多双引号:

db=> select ID from COMMONDATA_NWCG_AGENCIES limit 1;
ERROR:  relation "commondata_nwcg_agencies" does not exist
LINE 1: select ID from COMMONDATA_NWCG_AGENCIES limit 1;
                       ^
db=> select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
ERROR:  column "id" does not exist
LINE 1: select ID from "COMMONDATA_NWCG_AGENCIES" limit 1;
               ^
db=> select "ID" from "COMMONDATA_NWCG_AGENCIES" limit 1;
 ID 
----
  1
(1 row)

这是postgres11。此转储中的CREATE TABLE语句也带有双引号:

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
缺省情况下,Postgres会将所有内容转换为小写,除非使用双引号。
Arpit Singh,

3

从postgres转储的数据库还原数据后,我遇到了同样的问题。

我的转储文件从下面开始向南发送命令。

    SELECT pg_catalog.set_config('search_path', '', false);

解决方案:

  1. 可能将其删除或将其更改falsetrue
  2. 创建一个私有模式,该模式将用于访问所有表。

上面的命令只是停用所有可公开访问的模式。

在此处查看有关文档的更多信息:https : //www.postgresql.org/docs/9.3/ecpg-connect.html


1

该错误可能是由于访问限制引起的。解:

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

0

我使用pgAdmin创建表,而当我不使用保留字时,生成的表名称中带有引号,而几列中均带有引号。这是生成的SQL的示例。

CREATE TABLE public."Test"
(
    id serial NOT NULL,
    data text NOT NULL,
    updater character varying(50) NOT NULL,
    "updateDt" time with time zone NOT NULL,
    CONSTRAINT test_pk PRIMARY KEY (id)
)

TABLESPACE pg_default;

ALTER TABLE public."Test"
    OWNER to svc_newnews_app;

所有这些引号均以“随机”插入。我只需要删除并重新创建没有引号的表。

在pgAdmin 4.26上测试


0

就我而言,我还原的转储文件具有以下命令。

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

我已经评论了这些,然后又恢复了。问题解决了


0

我遇到此错误,结果证明我的连接字符串指向另一个数据库,显然该表不存在。

我花了几个小时,没有人提到要仔细检查您的连接字符串

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.