LoginSignup
1
0

More than 1 year has passed since last update.

Railsで作成したテーブルのidを初期化する

Posted at

環境

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から連番できれいに並ぶことになります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0