- 更新日: 2015年9月30日
- Rails
RailsのActiveRecordでSQLite3/PostgreSQLのidをリセットする拡張
SQLite3 や PostgreSQL な Rails プロジェクトで、プライマリーキーである id の auto increment な連番(シーケンス)をリセットする ActiveRecord の拡張です。development 環境でサンプルデータをDBテーブルに流し込んだ後に、レコードを delete_all(全部削除)してもう一回サンプルデータ追加をやり直す時なんかに、id が再び 1 から振られるようにするために使う。
— 環境 —
Rails 4.2
ActiveRecord 4.2
id をリセットする ActiveRecord 拡張
Rails プロジェクトで lib 以下にファイルを設置する。
lib/active_record/add_reset_pk_sequence_to_base.rb
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | module ActiveRecord   class Base     def self.reset_pk_sequence       case ActiveRecord::Base.connection.adapter_name       when 'SQLite'         new_max = maximum(primary_key) || 0         update_seq_sql = "update sqlite_sequence set seq = #{new_max} where name = '#{table_name}';"         ActiveRecord::Base.connection.execute(update_seq_sql)       when 'PostgreSQL'         ActiveRecord::Base.connection.reset_pk_sequence!(table_name)       else         raise "Task not implemented for this DB adapter"       end     end        end end | 
上記の ActiveRecord::Base.reset_pk_sequence のコードは、以下 stackoverflow ページを参考。
sql – Rails way to reset seed on id field – Stack Overflow
ActiveRecord 拡張が初期化で読み込まれるように設定
lib ディレクトリを autoload_paths に追加する。
config/application.rb
| 1 2 3 | config.autoload_paths += %W(   #{config.root}/lib ) | 
続いて config/initializers に以下のファイルを設置して、作成した ActiveRecord 拡張が初期化で読み込まれるようにします。
config/initializers/lib.rb
| 1 | require "active_record/add_reset_pk_sequence_to_base.rb" | 
id をリセットする使い方
データを rake タスクで投入。このデータを投入する方法は、rake タスク以外何でも良いです。CSV からや SQL 実行とか。
| 1 2 3 | $ bundle exec rake sample_data:populate_products | 
投入したデータをいったん削除して id リセット。
| 1 2 3 4 5 | $ bundle exec rails c pry> Product.delete_all pry> Product.reset_pk_sequence | 
データを再び投入。
| 1 2 3 | $ bundle exec rake sample_data:populate_products | 
以上のようにしてやると、サンプルデータの id が再び 1 から振られてデータを再投入できます。Product.reset_pk_sequence を実行せずに再度データを流し込むと、id の番号振りが以前の連番の最後の次の数字からになります。MySQL の id リセットについては以下リンク参考。
- – 参考リンク –
- sql – Rails way to reset seed on id field – Stack Overflow
- ruby on rails 3 – How to reset auto increment field in a ActiveRecord migration? – Stack Overflow
- MySQLでauto_incrementの値を初期化する方法 – while(life)tech_onoue++;
- Ruby – railsモデルを削除して新しくmodelを追加したらIDが飛ばされることなく削除したモデルのIDが設定されてしまった。 – Qiita
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)

 画像付き英語辞書 Imagict | 英単語をイメージで暗記
画像付き英語辞書 Imagict | 英単語をイメージで暗記









Leave Your Message!