Postgresql 테이블이 있지만 쿼리 할 때 "관계가 존재하지 않습니다"가 표시됨


85

여러 테이블이있는 postgresql db가 있습니다. 내가 쿼리하면 :

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

답변:


95

공개 스키마가 아닌 경우 스키마를 포함해야합니다.

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 표준의 Cluster> Catalog> Schema> Table 계층 구조에 익숙하지 않은 경우 관계형 데이터베이스에서 카탈로그와 스키마의 차이점은 무엇입니까 ?를 참조하십시오 . 그리고 내 다이어그램 .
Basil Bourque

네-해냈어요, 감사합니다. 물론 지금은을 받고 permission denied있지만 적어도 어디로 가야할지 알고 있습니다.
patkil

4
이 스레드의 향후 독자를 위해 스키마 이름 및 테이블 이름에 대소 문자가 혼합되어 있고 개별적으로 큰 따옴표로 묶이지 않은 경우와 같이이 오류가 발생할 수도 있습니다. "MY_SCHEMA" "MY_TABLE". 즉 그들은으로 지정되어야한다
Snidhi Sofpro

1
@SnidhiSofpro 필드 이름에서도 마찬가지입니다. 제 제안은 소문자 이름 만 사용하므로 번거로운 큰 따옴표를 추가 할 필요가 없습니다.
후안 카를로스 Oropeza

1
모든 것이 SET search_path TO my_schema;postgres 셸에서 작동 하지만 정확한 것이 파이썬 코드에서 작동하지 않으면 어떻게 될까요? 대소 문자를 구분하는 문제가 없습니다. 확실해!
알렉스 졸릭

22

당신은 시도 할 수 있습니다:

SELECT * 
FROM public."my_table"

my_table 근처에 큰 따옴표를 잊지 마세요.


3
테이블 이름에 큰 따옴표를 추가하면 저에게 효과적이었습니다. 감사.
iAkshay

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)

이것은 postgres 11입니다.이 덤프의 CREATE TABLE 문에도 큰 따옴표가 있습니다.

DROP TABLE IF EXISTS "COMMONDATA_NWCG_AGENCIES";

CREATE TABLE "COMMONDATA_NWCG_AGENCIES" (
...

4
Postgres는 기본적으로 큰 따옴표를 사용하지 않는 한 모든 것을 소문자로 변환합니다.
Arpit Singh 19

3

postgres 덤프 db에서 데이터를 복원 한 후 발생한 동일한 문제가 발생했습니다.

내 덤프 파일에는 다음과 같은 명령이 있습니다.

    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

이 오류가 발생하면 연결 문자열이 다른 데이터베이스를 가리키는 것으로 나타났습니다. 분명히 테이블이 거기에 존재하지 않았습니다.

나는 이것에 몇 시간을 보냈고 아무도 당신의 연결 문자열다시 확인 하도록 언급하지 않았습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.