[pgsql-jp: 36039] Re: PostgreSQLのシーケンス番号処理について

Akira Nakamura nakamura_ml @ art.edisc.jp
2005年 9月 22日 (木) 20:59:50 JST


こんばんは、中村です。

> 内容をもう少し、詳しく書くと
> 
> SELECT NEXTVAL('table_no_seq') FROM table;  <= ここで、シーケ
> ンス値取得
> pg_fetch_row($result, 0 , PGSQL_NUM); <= 0行目の値を取得
> INSERT INTO table(no,data1,date) VALUES ('[上で取得した番
> 号]','[データ内容]',CURRENT_TIMESTAMP); <= ここ
> で挿入

最初の行のNEXTVALを取得するだけなのに、「FROM table」を
しているのでしょうか?
「FROM table」を書く事で、tableの件数-1件分シーケンスは
無駄にカウントアップしています。

> という形で、処理を求めているので、基本的には、データが複数取れる
> 事に重大な問題がある訳ではないのですが
> tableのno がNotNullなので、
> NEXTVAL('table_no_seq')した時に、テーブルに行が有るにも関わらず
> データが取れない事が発生しているようなのです。

無駄にシーケンスをカウントアップする事は重大な問題だと思いますが...。

私の予想も、早川様と同じくMAXVALUE絡みだと思います。
西村様は、他のテーブルでは発生していないのでMAXVALUEでは無いと
お考えのようですが、SQLを実行する回数によっては、5万件のテーブルより
数百件のテーブルに方が先にMAXVALUEに到達してしまいます。

この辺の疑問をクリヤにする為にも以下のSQLの結果を教えてください。

select * from table_no_seq;
select count( * ) , max( no ) from table;

--
nakamura




pgsql-jp メーリングリストの案内