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
この小さなコードには注意しなければならない制限がいくつかあります。
- テーブルで所有されているシーケンスのみに動作します。