Fixing Sequences/ja

From PostgreSQL wiki
Jump to navigationJump to search

データベースのコピーや再作成時によくある問題として、データベースシーケンスがそのシーケンスを使用するテーブルに挿入する時のように更新されないことがあります。 シーケンスを既存の値の直後から始めさせたければ、以下のような最も一般的な設定を行うことで実現できます。

SELECT  'SELECT SETVAL(\'' ||S.relname|| '\', MAX(' ||C.attname|| ') ) FROM ' ||T.relname|| '  ;'
FROM pg_class AS S, pg_depend AS D, pg_class AS T, pg_attribute AS C
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
ORDER BY S.relname;

使用方法は通常以下のようになります。

  • これを例えば'reset.sql'という名前でファイルに保存します。
  • このファイルを実行し、その出力を通常のヘッダを含まないようにして保存し、それから、その出力を実行します。以下に例を示します。
psql -Atq -f reset.sql -o temp
psql -f temp
rm temp

この小さなコードには注意しなければならない制限がいくつかあります。

  • テーブルで所有されているシーケンスのみに動作します。