ハマっている「お菓子」を教えて!

エラーの詳細は以下のとおりです。

まず、ダウンロード後解凍したpostgresql-8.0-ja.msiを
ダブルクリックして、Windows2000serverSP4 に
postgreSQL8.02 をインストールしました。
このときユーザpostgreも新規作成しました。

つぎに、ツールpgAdmin3を使用して上記postgreユーザで
データベースtemplate1のpublicスキームの中に、
ID(int4), Book(text)の2フィールド、IDフィールドをキーとして、
tblBooksという名称の練習用の簡単なテーブルを作成しました。

さらに、pgAdmin3を使用して、このtblBooksテーブルに適当なレコードも4件追加でき、
pgAdmin3のテーブルビューで追加したこのレコード4件を確認できました。

また、pgAdmin3のクエリツールを用いて、クエリの下記を実行すると
正常に実行してくれます。
select version();
"PostgreSQL 8.0.2 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"

ところが、上で作成したtblBooksテーブルを含めたクエリを実行させると、
何回やっても次のようなエラーとなります。
select * from tblBooks;
ERROR: relation "tblbooks" does not exist.------(1)

pgAdmin3でなく、ツールpgSQLを使っても同じエラー(1)がでます。
この"relation does not exist"とは一体どんなエラーなんでしょうか?

環境は, Windows 2000 Server SP4 で、
template1,tblBooksは次のようになっています。

CREATE DATABASE template1
WITH OWNER = postgres
ENCODING = 'EUC_JP'
TABLESPACE = pg_default;
GRANT ALL ON DATABASE template1 TO postgres;

CREATE TABLE "tblBooks"
(
"ID" int4 NOT NULL,
"Book" text,
CONSTRAINT "key" PRIMARY KEY ("ID")
)
WITHOUT OIDS;

A 回答 (2件)

テーブル名に大文字と小文字が混在しているせい


でしょうか。。。
"tblbooks" か "TBLBOOKS" にしたほうがよい
とは思います。

(SQL文としては、大文字小文字どちらか一方
に統一されていれば、
"tblbooks"でCREATEしたテーブルでも、
"TBLBOOKS"でSELECTできるはずです。)

検証したわけではないので、はずしているかもしれませ
んが、CREATE TABLE "tblbooks" で作ってみても、
再現するでしょうか?
    • good
    • 0
この回答へのお礼

copymasterさん、回答ありがとうございます。
お蔭で長い期間の悩みが解決しました!
ポイントを20点でなく、1000点上げたいです。

きのうまで、日本語版でなく別版を再インストールしようか、
いやいっそPostgreSQLから去ろうかとまで思っていましたので、
助かりました。

以下のようにして、copymasterさんの回答が正しいことを確認しました。

同じスキームに、最初に作成したテーブルtblBooksに加えて
最初のtblBooksと同じ2フィールドを持つ、tblbooks, TBLBOOKSを新規追加作成し、
データだけは各テーブルを区別できるように異なるものをセットしました。
この時点で、エラーとならずに、ちゃんと3テーブルが追加できたのにかなり吃驚しました。

いよいよここで、select * form tblbooks;を実行すると、
見事、tblbooksの全レコードが表示されました!
ついでに、select * form tblBbooks; とやってみたら、
質問したエラーがでなくなりましたが、
表示されたレコードはtblBbooksのものでなく、なんとtblbooksのものでした。
さらに、select * form TBLBOOKS; とやっても、tblbooksの全レコードを表示し、
TBLBOOKSのものは出力されませんでした。

あらためて、PostgreSQL7.4.2のDocumentationでSQLのところを調べてみました。
すると、私が以前読んだときに引いた赤鉛筆の下線付で下記の記述がありました
(実践しないでただ読んだだけではだめなんですね)。

SQL is case insensitive about key words and identifiers,
except when identifiers are double-quoted to preserve the case (not done above).

そこで、SELECT * FROM "tblBooks";として、テーブル名をダブルクオテーションで括って
実行しましたら、念願のtblBooksの全レコードが表示されました。

以上から、PostgreSQLはSQL文実行前にダブルクオテーションで括った部分以外を
すべて小文字に変換するということなんでしょうか。

初めてのWindows native の PostgreSQLなので、
私みたいにWindowsのプログラム習慣を持ち込む人は、
多分、わたしと同じエラーに遭遇するような気がします。

改めて、copymasterさんに感謝し、この質問を閉じます。

お礼日時:2005/05/15 01:42

> この"relation does not exist"とは一体どんなエラーなんでしょうか?



該当するテーブル、この場合は"tblbooks"が無いということです。

該当のSQLにタイプミスなどはありませんでしょうか?
また、psql を使ってテーブル一覧を表示させたときにtblbooksは有りますか?
例 ---------------------------------------------------------
C:\>psql template1
template1=> \d
------------------------------------------------------------
http://www.postgresql.jp/document/pg802doc/html/ …

蛇足ですが、template1はデフォルトでは新規に作るデータベースの元に成るテンプレートデータベースですね。
http://www.postgresql.jp/document/pg802doc/html/ …
ここにテーブル等を追加すると、後から作るデータベースに自動的に作られてしまうので、通常のデータベースとして使うのは止めたほうが良いかと。
後でテーブル等を削除すれば良いだけの話では有りますが。
    • good
    • 2
この回答へのお礼

早速回答いただきありがとうございます。
テーブルが存在しないというエラーメッセージなんですね。
おかげでひとつ疑問が解決しました。

それから、当方PostgreSQL初心者ですのでtemplate1を
通常のデータベースにしてはいけないことも知りませんでした。

教えていただいたとおり、psqlを使ってみましたら、
エラー内容と違って、下記のとおり、そのテーブルを認識しています。
試しに、psqlでこのテーブルを使うSQLを実行すると、
またもや、relation "tblbooks" does not exist エラーがでます。

パスワード:
PostgreSQL の会話型ターミナル、psql 8.0.2 for windows へようこそ
template1=# \d
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+--------------+----------+----------
public | pg_logdir_ls | ビュー | postgres
public | tblBooks | テーブル | postgres
(2 行)

template1=# select * from tblBooks;
ERROR: relation "tblbooks" does not exist
template1=#

日本語版のpsql 8.0.2 for windows を使われている方で、
上記エラーが現れない方の回答もお待ちします。

お礼日時:2005/05/08 12:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す