There's an echo in my head

日々のメモ。

PostgreSQLでシーケンスオブジェクトを最大IDに合わせて更新する

PostgreSQLについてよくわかってないので、間違っている可能性も否めない

IDを指定してINSERTした場合にはシーケンスオブジェクトが更新されないっぽい。

たとえばfixtureなどから初期データをseedしたときなんかにIDがベタ書きされていると、あとあとレコードを追記したときに

PG::Error: ERROR:  duplicate key value violates unique constraint "people_pkey"
DETAIL:  Key (id)=(2) already exists.

みたいに怒られてしまうことがある。

というわけで、データを入れた後にIDの最大値+1にセットしておく。

SELECT setval('people_id_seq', coalesce((SELECT MAX(id)+1 FROM people), 1), false)

ちなみにpeople_id_seqの部分はRailsだとテーブル名_id_seqになっているみたいだけど、\d テーブル名スキーマを見ればPKのModifiersのところに書かれている。

また、実際にシーケンスオブジェクトの状態についてはSELECT FROM people_id_seqのように投げれば取得できる。

あとダブルクオーテーションじゃダメっぽい。

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。