存在Postgresql表,但不存在"关系"查询时

时间:2016-04-20 19:38:30

标签: sql postgresql

我有一个带有许多表的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' {}

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

9 个答案:

答案 0 :(得分:39)

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

SELECT *
FROM <schema>."my_table"

或者您可以更改默认架构

SHOW search_path;
SET search_path TO my_schema;

在此检查您的表架构

SELECT *
FROM information_schema.columns

enter image description here

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

SELECT * FROM parroquias_region
SELECT * FROM public.parroquias_region

但是扇区需要指定架构

SELECT * FROM map_update.sectores_point

答案 1 :(得分:5)

您可以尝试:

SELECT * 
FROM public."my_table"

别忘了my_table附近的双引号。

答案 2 :(得分:3)

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

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" (
...

答案 3 :(得分:2)

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

GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;

答案 4 :(得分:0)

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

我的转储文件具有以下命令,从那里开始向南移动。

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

解决方案:

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

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

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

答案 5 :(得分: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上测试

答案 6 :(得分:0)

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

CREATE SCHEMA employees;
SET search_path = employees, pg_catalog;

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

答案 7 :(得分:0)

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

我在此上花费了几个小时,没有其他人提到仔细检查您的连接字符串

答案 8 :(得分:0)

假设我们的数据库名称为“students”,模式名称为“studentinformation”,然后要使用此模式的所有表,我们需要先设置路径,这可以在 postgresql 中进行,例如

client.connect()
.then(()=>console.log("connected succesfully"))
.then(()=>client.query("set search_path to students"))
.then(()=>client.query("show search_path"))
.then(()=>client.query("set search_path to studentinformation"))
.then(()=>client.query("show search_path"))
.then(results => console.table(results.rows)) //setting the search path