PostgreSQLでsetvalではなく、sequenceのINCREMENT_BYを変更する

無断転載禁止 PostgreSQLでsetvalではなく、sequenceのINCREMENT_BYを変更する
postgreSQL

久しぶりのpostgres

もう十年近く前に構築したシステムで、少し前にプログラムの入替えをしたところ、
「IDが急に増えちゃってるよ」と連絡をいただいた。

ID周りはDB任せで特にプログラムで触っていなかったので、
DBを確認したところ、確かにIDが飛んでしまっていた。

業務には影響ないということだったけど、気になるのでIDを戻す事に。
使用しているDBが最近自分の案件では使用しなくなってきたPostgreSQL。

PostgreSQL(ぽすとぐれすきゅーえる: 発音例)はオープンソースのオブジェクト関係データベース管理システム (ORDBMS) である。引用元:wiki

postgresのsequenceをINCREMENT_BYで設定する

sequenceの値を確認

先ずは設定内容の確認

select * from シーケンステーブル名

ここでは「last_val」を確認したところ、確かにIDが想定以上に増えていた。

シーケンス値の設定はsetval

データ補正でシーケンス値を明示的に設定する場合は、通常以下で設定

SELECT setval('シーケンステーブル', 設定値); 

ここまではよくあるシーケンス値を設定する作業

シーケンス値が異常に飛ぶ

設定後、テストデータを入れたところ、シーケンス値が異常に飛んでしまっているのを発見。
調べたところ、シーケンステーブルのincrement_byが1ではないことが判明。
いつからそうなっていたのか不明だが、数十で設定してあった。

postgreSQLのincrement_byの変更方法

setvalのように、スムーズに変更できるのかと思いきや、
なかなか設定する方法が見つからない。

調べ方が悪かったようで、select関数ではなく、ALTER SEQUENCEで設定することが判明

ALTER SEQUENCE シーケンステーブル名 RESTART WITH シーケンス値 INCREMENT BY 増加数;

ALTER SEQUENCEでは、is_calledに注意

シーケンス値も増加数のincrement byも無事設定できたと思っていたところ、
設定後の初期値が1ずれていることが判明。
原因は「is_called」がfalseになってしまっていた。

多分オプションで同時に設定できるのだろうけど、
今回は初期値を1ずらして、正常稼働できるようにした。

160621_alter_sequence

PostgreSQLはとても使い易く、日本人ががんばっていたイメージだけど、
いつの間にかmysqlが主流になってしまいましたね。