CONTENTS
久しぶりの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ずらして、正常稼働できるようにした。
PostgreSQLはとても使い易く、日本人ががんばっていたイメージだけど、
いつの間にかmysqlが主流になってしまいましたね。