[pgsql-jp: 29531] sequenceオブジェクトについて

M.Yuasa mkys @ gray.plala.or.jp
2003年 4月 1日 (火) 07:20:51 JST


こんにちは。湯浅といいます。

sequenceオブジェクトを利用して、レコードIDを取得しているのですが以下のケース
で取得した値に重複が出てしまいました。

1)create sequence test_seq;
 →テスト用シーケンスオブジェクトを生成します。(lastvalue値はデフォルトの1とする)
  もちろん他にもテーブルなどのオブジェクトを生成します。
2)select nextval('test_seq')
 →nextval()関数で"1件だけ"シーケンス値を取得して、他テーブルのユニークな
  レコードIDなどに利用する。このとき取得した値は1となった。(正常)
3)pg_dumpall(pg_dump) > ./test.dat
 →データベースのダンプ
4)initdb -E UNICODE -D /var/lib/pgsql/data
 →データベースボリュームを新たに再生成する
  もちろん、シーケンスオブジェクトなどのゴミは無し
5)psql -e template1 < ./test.dat
 →3)のバックアップデータをリストア
6)select nextval('test_seq')
 →ここで何故か取得した値が既に取得しているはずの1となってしまい、この取得値
  を使って、2)の他テーブルにレコードをINSERTしようとしたら、キーの重複による
  SQLエラーが発生した

そこで、select * from test_seqでシーケンスオブジェクトのlastvalue項目値の変化と
nextval()の取得値の変化を見てみると、

      nextval()取得値  lastvalue値
1回目) 1           1
2回目) 2           1
3回目) 3                        2
4回目) 4           3
5回目) 5           4

のように変化していました。
1回目と2回目に取得したlastvalue値で1が連続してしまっているようです。
これは、sequenceオブジェクトのstart値を別値に設定しても起こりました。

連続してsequenceオブジェクトを使いつづければ全く問題となりませんが、sequence
オブジェクトを生成して、1度だけ値を取得した直後にpg_dumpなどでバックアップを取り、
後にそのデータをリストアしsequenceオブジェクトで値を取得した場合にバックアップ前に
取得したsequenceの取得値が再び現れるといった現象のように思います。

この件について、「使用方法が間違っている」または「回避方法」(バックアップリストア後
にsequenceを空読みなど?)など情報がありましたらご教授いただければ幸いです。

動作環境はPostgreSQL7.3.2(Redhat7.3でソースメイクして実行)です。

よろしくお願いします。





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