- ベストアンサー
テーブル作成時にエラー?
- RedHatLinux9.0とPostgreSQL8.0.3の環境でテーブル作成時にエラーメッセージが表示されます。対処法を教えてください。
- テーブル作成時に「NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index 'PK_SIKYO' for table 'TM_SIKYO'」というメッセージが表示され、テーブルを作成できません。
- Windows版のPostgreSQLで作成したSQL文を利用してテーブルを作成しようとしていますが、プライマリーキーの設定が正しくできていないようです。対処法を教えてください。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> =# select * from "TOUSHIN"."TM_SIKYO"; > ERROR: schema "TOUSHIN" does not exist なぜでしょう・・・ > =# select * from pg_tables where tablename='TM_SIKYO'; > schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers ------------+-----------+------------+------------+------------+----------+------------- > TOUSHIN | TM_SIKYO | TOUSHIN | | t | f | f > (1 row) この結果から、スキーマ「TOUSHIN」は存在しているはずなので、もしかしたら「TM_SIKYO」のテーブルオーナーが「TOUSHIN」になっているのと現在のログインユーザーは誰か?あたりにヒントがあるかもしれませんね。 スーパーユーザーでと書かれていたので、普通はpostgresになるのかな?とは思ったのですが・・・ ・・・・このあたりで解決しないとちょっと私の分かる範疇を超えてきてしまってるな
その他の回答 (5)
- asahina02
- ベストアンサー率47% (95/202)
> =# select * from tm_sikyo; > ERROR: relation "tm_sikyo" does not exist select するときにちゃんとスキーマ指定しないとダメだと思います。 正しくは select * from "TOUSHIN"."TM_SIKYO" ※大文字小文字も判別されるかと・・ 他の部分については分かりません。スイマセン。 また、他の部分を知りたい場合、当初の質問と大分趣旨が変わってしまっているので、新しい質問にした方が、回答をもらえるかもしれません。
お礼
ありがとうございました。
補足
スキーマ指定をしてやってみたところ、 =# select * from "TOUSHIN"."TM_SIKYO"; ERROR: schema "TOUSHIN" does not exist と出てきてしまいます。TOUSHINスキーマがないようですが・・・ >また、他の部分を知りたい場合、当初の質問と大分趣旨が変わってしまっているので、新しい質問にした方が、回答をもらえるかもしれません。 趣旨が変わってきてしまってすいません。 これらのことは違うときに調べたり質問してみるなどしてみます。
- asahina02
- ベストアンサー率47% (95/202)
詳しくは分からないですが、「\z」の場合、publicスキーマのテーブルしか表示しないようです。 今回のテーブルは「TOUSHIN」スキーマに作成されている為、表示されていないと思われます。 試しに対象テーブルにSELECT等してみてください。 > 例えば、DB保守担当者の「admin」とした場合、ユーザをadminに切り替えて> createdbなどのコマンドを実行しようと思うとできなかったのですが、これ> が関係しているなんてことはあるのでしょうか? これは createuser admin っていうコマンドで行ってますよね? その際に英語に2回ほど質問(y/n)があったと思いますが、その際の回答でDB作成権限無しとしたからだと思います。
お礼
ありがとうございました。
補足
ありがとうございます。 select文を実行してみましたところ、次のような結果になりました。 =# select * from tm_sikyo; ERROR: relation "tm_sikyo" does not exist すいません。テーブルはできできていたみたいです。 =# select * from pg_tables where tablename='TM_SIKYO'; schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers ------------+-----------+------------+------------+------------+----------+------------- TOUSHIN | TM_SIKYO | TOUSHIN | | t | f | f (1 row) ただ、こちらでは表示されるのですが、\dで表示されないのはなぜでしょう? PostgreSQL(データベース)の基本的なことかもしれませんが・・・ >これは createuser admin っていうコマンドで行ってますよね? >その際に英語に2回ほど質問(y/n)があったと思いますが、その際の回答でDB作成権限無しとしたからだと思います。 えっと作成権限は与えてあります。 linux側にも「admin」というユーザを登録して、このユーザに切り替えてからcreatedbなどのコマンドが実行できませんでした。 権限設定でどこか間違っているのだと思うのですが・・・
- asahina02
- ベストアンサー率47% (95/202)
> NOTICE: CREATE TABLE will create implicit sequence "TM_SIKYO_SHIKYO_CD_seq" for serial column "TM_SIKYO.SHIKYO_CD" > NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "TM_SIKYO_pkey" for table "TM_SIKYO" > CREATE TABLE これってもしかしてテーブル作られてませんか?(3行目) 単に作った後の、テーブル存在確認の方法が間違っているってことはないでしょうか? 参考URLでは同じメッセージで出来ているような感じなのですが。 ちなみに権限確認についても参考URLで。
お礼
ありがとうございました。
補足
ありがとうございます。 確認してみたのですが、できていないみたいです。 # \z Access privileges for database "toushin_db" Schema | Name | Type | Access privileges --------+------+------+------------------- (0 rows) # \d No relations found. 参考URLを見ていろいろと行ってみたのですが、やはりうまくいきません。 ちょっと気になったのですが、 例えば、DB保守担当者の「admin」とした場合、ユーザをadminに切り替えてcreatedbなどのコマンドを実行しようと思うとできなかったのですが、これが関係しているなんてことはあるのでしょうか?
- asahina02
- ベストアンサー率47% (95/202)
自分の環境(サーバー不明:PostgreSQL 8.0.3)では最初のSQL文でもうまくいきました。 (最初から自分の環境も試せばよかったですね・・m(_ _)m) もしかしてsequence、indexの作成権限がないなんてことは??
お礼
ありがとうございました。
補足
PostgreSQLのスーパユーザで作業を行っているので大丈夫だと思うのですが・・・ ちなみに権限を確認する方法ってどうすればよいのでしょうか? 基本的なことですいません。
- asahina02
- ベストアンサー率47% (95/202)
プライマリキーとして設定しているSHIKYO_CDのキーが2重に作成されようとしているからではないでしょうかね? 同じような状況に合ったことないので、これで解決するか分かりませんが、 "SHIKYO_CD" int4 NOT NULL DEFAULT nextval('"TOUSHIN"."TM_SIKYO_SHIKYO_CD_seq"'::text), を "SHIKYO_CD" serial PRIMARY KEY, に変えて、 ,CONSTRAINT "PK_SIKYO" PRIMARY KEY ("SHIKYO_CD") を削除してみてはいかがでしょう? これでほぼ同じ意味のCREATE文になると思うのですが。 ※SHIKYO_CD_pkeyというシーケンスが勝手に作成されます。 ↑名称はちょっとうろ覚え・・・
お礼
ありがとうございました。
補足
ありがとうございます。 早速ですが、以下のSQL文を実行してみたところ、次のようなエラーが帰ってきました。 「SQL文」 CREATE TABLE "TOUSHIN"."TM_SIKYO" ( "SHIKYO_CD" serial PRIMARY KEY, "SHIKYO_NM" varchar(50), "SHIKYO_RNM" varchar(50), "SHOW_FLAG" bool, "UNUSE_FLAG" bool, "CREATE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CREATE_ID" varchar(10), "CHANGE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CHANGE_ID" varchar(10) ) WITHOUT OIDS; 「結果」 NOTICE: CREATE TABLE will create implicit sequence "TM_SIKYO_SHIKYO_CD_seq" for serial column "TM_SIKYO.SHIKYO_CD" NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "TM_SIKYO_pkey" for table "TM_SIKYO" CREATE TABLE テーブルは作成されていませんでした。 先ほどと違うエラーが1つ出ているようですが・・・ 何が原因なのでしょうか?
お礼
スキーマの設定【CREATE SCHEMA "TOUSHIN" AUTHORIZATION "TOUSHIN";】をやり直したあとに、テーブル作成を行いましたらうまくいきました。 原因はおそらくなのですが、スキーマ設定を違うDBに接続した状態で行ったからではないかと思われます。 template1に接続して、createdbとcreateuserとcreatetablespaceを行った後にスキーマの設定までしてしまったからだと思います。 いろいろ勉強になりました。 ありがとうございました。