[pgsql-jp: 38278] 主キーの重複登録とそれに伴うlikeと=の検索結果の相違について
岩藤 謙一郎
iwafuji.kenichiro @ toshiba-sol.co.jp
2007年 4月 4日 (水) 12:04:39 JST
はじめまして、岩藤と申します。
過去スレッドを3カ月分ほどさかのぼってみたのですが、類似のトピックがなかったようなので、投稿させていただきます。
以下の作業は全てpgAdmin III Queryを利用して行っております。
また、PostgreSQLのバージョンはプロンプトから調べたところ
PostgreSQL 8.0.0 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2
となっています。
次のようなテーブルを作成しました。(簡略化してあります)
CREATE TABLE tbl_test
(
"主キー" varchar(20) NOT NULL,
"その他" varchar(20),
CONSTRAINT tbl_test_pkey PRIMARY KEY ("主キー")
)
WITHOUT OIDS;
ALTER TABLE tbl_test OWNER TO postgre;
で、その後、次のようなInsert文を発行しました。
insert into tbl_test (主キー) values('r232');
(r232は小文字のrのみ全角で後は半角です(以下同様))
本来ならば主キーは一意のため、同様の命令が2回行われると
ERROR: duplicate key violates unique constraint "tbl_test_pkey"
のようなエラーコードが出るはずなのですが、何回でもクエリが実行されてしまいます。
また、その後次のようにして、挿入されたレコードを見ようとしたところ
select * from tbl_test where 主キー = 'r234';
該当するレコードは存在しないことになっています。
また、ワイルドカードを利用しないlikeは=と同値であると認識しているのですが、
次のような命令を実行すると、クエリ実行回数分のレコードがあるように見えます。
select * from tbl_test where 主キー like 'r234';
これは全件検索でも同様です(つまりデータは作成される)。
で、テーブルを新規に作り直しても同様の事象がおき、先頭に2バイト英字を入れても
同様の結果が発生してしまいます。(他の値でも発生するかもしれません)
また、開発中のWebアプリから直接コネクトしてSQLを発行しても同様の事象が発生します。
で、以上を踏まえた上での質問なのですが
1.PostgreSQLにおいて、=とlikeはワイルドカードを用いない限り同値であると認識してよいのでしょうか?
2.この事象は私の端末、及びバージョンでのみ発生するものなのでしょうか?
3.先頭文字を全角にしたままで、この現象を回避することはできますでしょうか?
以上 長文になってしまいましたが、ご回答いただけると幸いです。
また、既知の問題であったら申し訳ありません。
pgsql-jp メーリングリストの案内