LoginSignup
5
3

More than 5 years have passed since last update.

postgreSQLではテーブル名は小文字に統一する

Posted at

問題:S2jdbc-gen-buildタスクを実行したところテーブルが見つからない

sqlstate:42p01が発生していた。

ログ抜粋

/s2jdbc-gen-build.xml:40: Exception in thread "main" org.seasar.extension.jdbc.gen.exception.CommandFailedRuntimeException: [ES2JDBCGen0005]コマンド(org.seasar.extension.jdbc.gen.internal.command.GenerateEntityCommand)の実行に失敗しました。バージョンは S2JDBC-Gen 2.4.46 です。理由はorg.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[], Message=[ERROR: relation "public.mstuser" does not exist

[gen-entity] DEBUG 2015-07-12 11:22:30,396 [main] select user_id from public.mstUser where 1 = 0

原因

オペミス。pgAdmin3でテーブル作成する際の名称が不適切だった。
具体的にはpgAdmin3でテーブル名:mstUserを作成していた。
(本来:mst_userとすべき)

pgAdmin3でGUI上で大文字・小文字を混在したテーブルを指示すると、プログラマが指示通りにオブジェクト名は大文字・小文字が混在したものが作成される。(これは自動生成されるDDLがクウォートを付与するためと考えられる)

・エラー
select user_id from public.mstUser where 1 = 0

・正常
select user_id from public."mstUser" where 1 = 0

postgreSQLの仕様

オブジェクト名について

大文字・小文字は区別する

SQL発行時のダブルクウォート有無について

ダブルクウォート:なし

大文字は自動的に小文字に内部的に変換して処理される。
public.mstUser → public.mstuser
※オブジェクトは大文字・小文字を区別するのでnot existエラーが発生する。

ダブルクウォート:あり

大文字を自動的に小文字に変換せず処理される。
"public.mstUser" → public.mstUser
従って、テーブルが見つかる。

対策

テーブル名は小文字で統一し、アンダースコアで区切る
(本来:mst_userとすべき)

参考サイト

https://www.softel.co.jp/blogs/tech/archives/1847
http://faq.smileserver.ne.jp/faq/1060/app/servlet/qadoc?fromid=001&qid=000822
http://takuya-1st.hatenablog.jp/entry/20110907/1315373488

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3