[php] PostgreSQL 테이블 이름을 사용할 수 없습니다 (“관계가 존재하지 않습니다”)

간단한 데이터베이스 쿼리를 수행하기 위해 다음 PHP 스크립트를 실행하려고합니다.

$db_host = "localhost";
$db_name = "showfinder";
$username = "user";
$password = "password";
$dbconn = pg_connect("host=$db_host dbname=$db_name user=$username password=$password")
    or die('Could not connect: ' . pg_last_error());

$query = 'SELECT * FROM sf_bands LIMIT 10';
$result = pg_query($query) or die('Query failed: ' . pg_last_error());

다음과 같은 오류가 발생합니다.

쿼리 실패 : 오류 : “sf_bands”관계가 없습니다

모든 예제에서 관계가 존재하지 않는다는 오류가 발생하는 위치를 찾을 수 있습니다. 테이블 이름에 대문자를 사용하기 때문입니다. 내 테이블 이름에 대문자가 없습니다. 데이터베이스 이름을 포함하지 않고 테이블을 쿼리하는 방법이 showfinder.sf_bands있습니까?



답변

내가 읽은 것에서이 오류는 테이블 이름을 올바르게 참조하지 않았 음을 의미합니다. 일반적인 이유 중 하나는 테이블이 대소 문자를 혼합하여 정의되어 있고 모든 소문자를 사용하여 쿼리하려고하기 때문입니다.

다시 말해, 다음과 같은 경우 실패합니다.

CREATE TABLE "SF_Bands" ( ... );

SELECT * FROM sf_bands;  -- ERROR!

큰 따옴표를 사용하여 식별자를 구분하여 테이블이 정의 될 때 특정 대소 문자를 사용하는 맞춤법을 사용할 수 있습니다.

SELECT * FROM "SF_Bands";

주석을 다시 말해 “search_path”에 스키마를 추가하면 스키마를 규정하지 않고 테이블 이름을 참조 할 때 쿼리가 각 스키마를 순서대로 확인하여 해당 테이블 이름과 일치하게됩니다. PATH쉘이나 include_pathPHP 와 마찬가지로 현재 스키마 검색 경로를 확인할 수 있습니다.

SHOW search_path
  "$user",public

스키마 검색 경로를 변경할 수 있습니다.

SET search_path TO showfinder,public;

참조 http://www.postgresql.org/docs/8.3/static/ddl-schemas.html


답변

나는 이것에 문제가 있었고 이것은 이야기입니다 (슬프지만 사실입니다) :

  1. 테이블 이름이 모두 소문자 : 계정과 같은 경우 사용할 수 있으며 다음 select * from AcCounTs과 같이 작동합니다.

  2. 테이블 이름이 모두 소문자 인 경우 accounts
    다음이 실패합니다.
    select * from "AcCounTs"

  3. 테이블 이름이 대소 문자가 혼합 된 경우 Accounts
    다음이 실패합니다.
    select * from accounts

  4. 테이블 이름이 대소 문자가 혼합 된 경우 : Accounts
    다음은 정상적으로 작동합니다.
    select * from "Accounts"

나는 이런 쓸모없는 것들을 기억하는 것을 좋아하지 않지만 당신은;)해야합니다.


답변

다른 RDMS와 다른 Postgres 프로세스 쿼리 “SCHEMA_NAME”과 같이 테이블 이름 앞에 스키마 이름을 큰 따옴표로 묶으십시오. “SF_Bands”


답변

연결 문자열에 dbname 매개 변수를 넣으십시오. 다른 모든 것이 실패하는 동안 그것은 나를 위해 작동합니다.

또한 선택을 수행 할 때을 지정하십시오 your_schema. your_table이처럼 :

select * from my_schema.your_table


답변

OSX에서도 비슷한 문제가 있었지만 큰 따옴표와 작은 따옴표로 놀았습니다. 귀하의 경우 다음과 같은 것을 시도 할 수 있습니다

$query = 'SELECT * FROM "sf_bands"'; // NOTE: double quotes on "sf_Bands"


답변

이것은 정말 도움이됩니다

SET search_path TO schema,public;

이 문제를 더 자세히 조사한 후 현재 데이터베이스의 새 사용자에 대해 defoult로이 “search_path”를 설정하는 방법에 대해 알아 냈습니다.

데이터베이스 속성을 연 다음 시트 “변수”를 열고 사용자를 위해이 변수를 실제 값으로 추가하십시오.

이제 사용자는 defoult를 통해이 schema_name을 가져오고 schemaName없이 tableName을 사용할 수 있습니다.


답변

인용 부호로 스키마 이름과 테이블 이름을 작성해야합니다. 아래:

select * from "schemaName"."tableName";