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
のように投げれば取得できる。
あとダブルクオーテーションじゃダメっぽい。