[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_path
PHP 와 마찬가지로 현재 스키마 검색 경로를 확인할 수 있습니다.
SHOW search_path
"$user",public
스키마 검색 경로를 변경할 수 있습니다.
SET search_path TO showfinder,public;
참조 http://www.postgresql.org/docs/8.3/static/ddl-schemas.html
답변
나는 이것에 문제가 있었고 이것은 이야기입니다 (슬프지만 사실입니다) :
-
테이블 이름이 모두 소문자 : 계정과 같은 경우 사용할 수 있으며 다음
select * from AcCounTs
과 같이 작동합니다. -
테이블 이름이 모두 소문자 인 경우
accounts
다음이 실패합니다.
select * from "AcCounTs"
-
테이블 이름이 대소 문자가 혼합 된 경우
Accounts
다음이 실패합니다.
select * from accounts
-
테이블 이름이 대소 문자가 혼합 된 경우 :
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";