Я хочу, щоб значення первинного ключа знову починалися з 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
kill_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
Я використовую Rails 4.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'" )