主キーの値をもう一度1から始めたい。
回答:
SQLiteでインデックス/主キーをリセットするには、次のように入力します。
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")
それを実行しましたsqlite_sequence where name = 'yourtablename' is not a valid table name
。
テーブル内のすべてのデータを削除する方法を見つけるために、多くの人(私のような)がここに来ます。どうぞ:
$ rails console
> ModelName.delete_all
または
> ModelName.destroy_all
destroy_allは依存関係とコールバックをチェックし、少し時間がかかります。delete_allはストレートSQLクエリです。
詳細はこちら:http://apidock.com/rails/ActiveRecord/Base/delete_all/class
Railsコンソールから以下を使用してテーブル内のすべてを削除してから、インデックスカウンターをリセットしました(Ruby 2&Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_name
が、モデルの単数形の名前ではなく、テーブルの実際の名前のように、resetコマンドで複数形にする必要があるということです。
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
ます:。
Rails 4.2以降truncate
、ActiveRecord接続で直接使用できます。
ActiveRecord::Base.connection.truncate(:table_name)
これは、すべてのデータをワイプし、自動インクリメントカウンタをリセットし、テーブルに。MySQLとPostgresで動作しますが、Sqliteでは動作しません。
gem 'database_cleaner'
Gemfileに追加し、を実行してから、次のようにします$ bundle install
。
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
より多くのテーブルを指定できます。
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
最後のパラメーターを省略すると、データベース全体が切り捨てられます。
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
Rails4.2.0とSqlite3を使用しています
これが私のために働いたものです(上記のすべてから少し取ってください):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
その後、インデックスを1から始めて、テーブルに新しいレコードを追加することができました。
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )