🈯

【Rails】指定したテーブルの主キーのシーケンスをリセットする

2023/12/12に公開

はじめに

テーブルからすべてのデータを削除した後にデータを再挿入する際、新たに挿入されるデータのIDは以前削除されたレコードのIDの最大値に続く数値から付与されます。その場合はテーブルのシーケンスがリセットされず、IDが1(または設定された最小の値)から開始されることはありません。結果、新しく追加されたレコードのIDが飛び飛びの値になったり、予期しない大きな数値になったりする可能性があります。
そのような状況を防ぐために指定したテーブルの主キーのシーケンスをリセットする方法の紹介です。

reset_pk_sequence!の使用

reset_pk_sequence!は、指定したテーブルの主キー(ID)のシーケンス(自動増分)をリセットするメソッドです。このメソッドは、PostgreSQLデータベースのシーケンス値のリセットに有用です。挙動としては、該当テーブルの最大IDを取得し、次に挿入されるレコードのIDとして設定します。

使用例

このメソッドは主に以下のようなシチュエーションで利用されます:

  1. テーブルの全データを削除または再作成した場合:
    この場合は、全てのレコードを削除し、新しいデータを挿入する際に、IDが連続した数値となるようにするために使われます。具体的な操作は次の通りです。
Hoge.delete_all
ActiveRecord::Base.connection.reset_pk_sequence!(Hoge.table_name)
  1. テーブルのデータを手動で操作した場合:
    データベースのレコードを手動で追加、削除した場合や、大量のデータを一度にインポートした場合など、IDのシーケンスが連続的でなくなったときに使われます。
ActiveRecord::Base.connection.reset_pk_sequence!(Hoge.table_name)

注意点

このメソッドは現在のテーブルの中で最大のIDに基づいてシーケンスをリセットします。したがって、以前のIDが再利用されることはありません。そのため、あるIDが特定のレコードを一意的に識別することが重要な場合(例えば、外部アプリケーションがIDによってレコードを参照している場合など)は、シーケンスのリセットは慎重に行いましょう。

参考

https://apidock.com/rails/ActiveRecord/ConnectionAdapters/PostgreSQL/SchemaStatements/reset_pk_sequence!

Discussion