1. ホーム
  2. php

[解決済み】PostgreSQLのテーブル名を単純に使用できない(「関係が存在しない」)。

2022-04-05 10:32:43

質問

以下の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());

この場合、以下のようなエラーが発生します。

クエリーに失敗しました。ERROR: relation "sf_bands" does not exist

リレーションが存在しないというエラーが発生したすべての例で、テーブル名に大文字を使用していることが原因です。私のテーブル名には大文字がありません。データベース名を含まずに、私のテーブルを照会する方法はありますか? 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