環境
Rails 5.2
PostgreSQL12.10
はじめに
タイトルにある通り、Railsで作成したテーブルのidを初期化する方法についての記事です。テーブルを全件トランケートした後、データを新規登録をすると、id=1から振り直してくれるものと期待していても、そのようにはしてくれません。全件トランケートしたとても、最後に登録したidの次から連番で振り続ける仕様になっています。
idはあくまで、内部的に管理される項目であるため、idに何が登録されようが、気にしなければいいのですが、1からきれいに連番で登録されていないと気持ちが悪いという人は、idを初期化する必要があります。
やったこと
PostgreSQLにログインします。
$psql -h localhost -d DB名 -U ユーザーID
全てのidを表示させてみます。
#select id from users order by id;
データ件数が大量にある場合は1件に絞り込んで、idのMAXを調べます。
#select max(id) from users;
現在登録されているMAXのidを表示します。上記のテーブルのidのMAX値と同じ値になっているはずです。
#select * from users_id_seq;
テーブルのデータを全件削除します。truncate文ではなく、delete文で削除しても同じです。データ件数が大量にある場合は、トランケートの方が処理が早くなります。ただし、トランケートした場合は、ロールバックができなくなります。当然、トランザクションを掛けていた場合の話ではありますが。
#truncate table users;
データが確かに削除されたことを確認します。
#select * from users;
(0 rows)
idを1に初期化します。
#select setval ('users_id_seq', 1, false);
setval
--------
1
(1 row)
idが確かに初期化されたことが確認できます。
#select * from users_id_seq;
last_value | log_cnt | is_called
------------+---------+-----------
1 | 0 | f
(1 row)
Railsからusersテーブルに、seedsでデータを流し込んだら、idが1から連番できれいに並ぶことになります。