レコードはあるがシーケンスの値が消えてしまった、なんて時に select setval('table_col_seq', 123)
みたいなのを叩くので、そのSQLを生成するSQLを書いた。
2023/06/21 追記:
文字数基準で切り出すなんて雑なことをしないものが PostgreSQL wiki にあるようなので、そっちを使うのがよいかと思います。実現方法は違えど「setvalするSQLを自動生成する」というのは同じなので、同じように使えます。
https://wiki.postgresql.org/wiki/Fixing_Sequences
select
'select setval(''' || sequence || ''', (select max(' || column_name || ') from ' || table_name || '));' as setval
from
(
select
table_name
, column_name
, substr(column_default, 10, length(column_default) - 21) as sequence
from
information_schema.columns
where
table_schema = 'public'
and column_default like 'nextval(%'
) a;
publicスキーマ内のテーブルでデフォルト値に使われてるシーケンスが対象。ひとつのシーケンスを複数の列で共有してる状況とかは想定していない。
簡単な解説:
- publicスキーマの全テーブルの全カラムのうち、デフォルト値が
nextval(
で始まるものを抽出し -
nextval('accounts_id_seq'::regclass)
みたいな文字列からaccounts_id_seq
を取り出し - テーブル名や列名と組み合わせて
select setval('accounts_id_seq', (select max(id) from accounts));
を生成
見てのとおりすごく単純なので、おかしなSQLが生成されてないか一応確認してね。。