【问题标题】:Postgresql tables exists, but getting "relation does not exist" when queryingPostgresql 表存在,但查询时得到“关系不存在”
【发布时间】:2016-08-13 17:00:05
【问题描述】:

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

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

【问题讨论】:

  • 你能对另一张桌子做同样的事情吗?尝试创建一个新的。
  • 您显示的查询无效。 WHERE table_name="my_table"; 无效,因为"my_table" 引用了一个列名,而information_schema.columns 中没有这样的列。请edit您的问题并添加您用于创建表的exact create table 语句。

标签: sql postgresql


【解决方案1】:

如果不是公共架构,则必须包含架构

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

【讨论】:

  • 正确答案。如果不熟悉 SQL 标准的 Cluster > Catalog > Schema > Table 层次结构,请参阅问题 What's the difference between a catalog and a schema in a relational database?my diagram
  • 是的 - 做到了,非常感谢。当然,现在我收到了permission denied,但至少我知道该去哪里。
  • 对于这个线程的未来读者,这个错误也可能发生,就像我的情况一样,当模式名称和表名称有混合大小写字符 & 没有单独括在双引号中时。换句话说,它们必须指定为:“my_Schema”。“my_Table”
  • @SnidhiSofpro 那么字段名称也会发生这种情况,我的建议只是使用小写名称,这样您就不必添加双引号的麻烦。
  • 如果在 postgres shell 中一切都与SET search_path TO my_schema; 一起工作,但在 python 代码中却不能正常工作怎么办?我没有任何区分大小写的问题。我确定!
【解决方案2】:

你可以试试:

SELECT * 
FROM public."my_table"

不要忘记 my_table 附近的双引号。

【讨论】:

  • 在表名中添加双引号对我有用。谢谢。
  • 这对我有用。但是为什么它可以使用双引号而不是没有它呢?
【解决方案3】:

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

我的转储文件有下面的命令,事情从这里开始往南走。

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

解决方案:

  1. 可能会删除它或将 false 更改为 true
  2. 创建将用于访问所有表的私有架构。

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

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

【讨论】:

    【解决方案4】:

    我必须在表名中包含双引号。

    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)
    

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

    DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";
    
    CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
    ...
    

    【讨论】:

    • Postgres 默认情况下会将所有内容转换为小写,除非使用双引号。
    【解决方案5】:

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

    GRANT ALL PRIVILEGES ON DATABASE my_database TO my_user;
    

    【讨论】:

      【解决方案6】:

      我使用 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 上测试

      【讨论】:

        【解决方案7】:

        就我而言,我恢复的转储文件有这些命令。

        CREATE SCHEMA employees;
        SET search_path = employees, pg_catalog;
        

        我已经评论了这些并再次恢复。问题解决了

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

            假设我们的数据库名称为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 
            

            【讨论】:

              【解决方案10】:

              将所有表名保持小写,因为当您回滚然后转到最新时,它显然在寻找小写。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-07-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2019-01-10
                • 1970-01-01
                相关资源
                最近更新 更多