[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 メーリングリストの案内