LoginSignup
19
20

PostgreSQLでシーケンスを今の最大値にリセットする

Last updated at Posted at 2013-12-18

レコードはあるがシーケンスの値が消えてしまった、なんて時に 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スキーマ内のテーブルでデフォルト値に使われてるシーケンスが対象。ひとつのシーケンスを複数の列で共有してる状況とかは想定していない。

簡単な解説:

  1. publicスキーマの全テーブルの全カラムのうち、デフォルト値が nextval( で始まるものを抽出し
  2. nextval('accounts_id_seq'::regclass) みたいな文字列から accounts_id_seq を取り出し
  3. テーブル名や列名と組み合わせて select setval('accounts_id_seq', (select max(id) from accounts)); を生成

見てのとおりすごく単純なので、おかしなSQLが生成されてないか一応確認してね。。

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20