🆔

【Rails】SeedでDBのシーケンスを特定の値に設定する

2023/09/21に公開

はじめに

RailsのSeedファイルを使用すると、データベースに初期データを追加することができます。しかし、シーケンスの値を適切に設定しないと、新しいレコードの作成時に予期しない結果が生じる可能性があります。
そこで本記事では、RailsのSeedファイル内でシーケンス値を設定する方法について紹介します。

方法

ActiveRecord::Base.connection.execute(
  "SELECT setval('hoges_id_seq', #{Hoge.maximum(:id)}, true)"
)

このコードでは、Hogeモデルの中で最大のid値を取得し、それを使用してシーケンスの値を設定します。

具体的には、以下の手順でシーケンスの値が変更されます

  1. Hogeモデルの中で最大のid値を取得します。
  2. 取得した最大のid値を使用して、
    SELECT setval('hoges_id_seq', #{Hoge.maximum(:id)}, true)を実行します。このクエリは、指定されたシーケンス(hoges_id_seq)の現在値を指定された最大値に設定するものです。
  3. シーケンスの現在値が最大値に設定されます。これにより、次に新しいレコードが挿入される際に、シーケンスの値は指定された最大値+1となります。

この設定を行うことで、新しいレコードの作成時に正しいシーケンス値が使用されるようになります。

具体例を挙げると、もしHogeテーブルの中で最大のid値が100であった場合、上記のコードを実行すると、シーケンスhoges_id_seqの現在値が100に設定されます。次に新しいレコードを挿入すると、そのレコードのidカラムには101が割り当てられます。これにより、データベース内のシーケンスと実際のレコードのid値が一致するようになります。

最後に

シーケンスの設定は、データベースのデータ整合性を保つために重要です💦
ぜひ参考にしてみてください!

Discussion