PostgreSQL テーブル名を単純に使用することはできません (「関係が存在しません」) 質問する

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?

ベストアンサー1

このエラーは、テーブル名を正しく参照していないことを意味します。よくある原因の 1 つは、テーブルが大文字と小文字が混在したスペルで定義されているのに、すべて小文字でクエリしようとしていることです。

つまり、次の例は失敗します。

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;

search_path の詳細については、こちらをご覧ください。https://www.postgresql.org/docs/current/ddl-schemas.html#DDL-SCHEMAS-PATH

おすすめ記事