Как сбросить одиночный стол в рельсах?

86

Я хочу, чтобы значения первичного ключа снова начинались с 1.

юкас
источник

Ответы:

27

Чтобы сбросить индекс / первичный ключ в SQLite, просто введите:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
Рик
источник
1
черпая вдохновение из вашего ответа ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye
1
Если кто-то попробовал это и получил ошибку, я это сделал, ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")и это сработало, потому что это выдало бы мне ошибку, которая говорила sqlite_sequence where name = 'yourtablename' is not a valid table nameили что-то в этом роде.
l1zZY
184

Многие люди (например, я) приходят сюда, чтобы узнать, как удалить все данные в таблице. Ну вот:

$ rails console

> ModelName.delete_all

или

> ModelName.destroy_all

destroy_all проверяет зависимости и обратные вызовы и занимает немного больше времени. delete_all - это прямой SQL-запрос.

Подробнее здесь: http://apidock.com/rails/ActiveRecord/Base/delete_all/class

Flaviu
источник
14
Это решение сбрасывает записи таблицы, но не первичный ключ.
Justin D.
4
Да, это здорово, но я хочу сбросить индекс! Ни delete_all, ни destroy_all не сбрасывают индекс до 1.
Кайл Клегг
Этот ответ решил вопрос большинства пользователей, которые его достигли. Вот что действительно важно. Кроме того, это не единственный ответ, и он не отмечен как правильный. Автор также объяснил свое намерение. Так что я не вижу проблем.
Эдисон Мачадо
45

Я использовал следующее из консоли rails, чтобы удалить все в таблице, а затем сбросить счетчик индекса (Ruby 2 и Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
Мельтеми
источник
3
У меня это сработало очень хорошо, но небольшая деталь заключается в том, что ваша model_nameкоманда сброса должна иметь множественное число, например, фактическое имя таблицы, а НЕ единственное имя модели.
Эли Дюк,
Также работает с символической версии: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Крис Сайрефис
18

Ссылка @ khelll полезна. Команда, которую вы хотите усечь одну таблицу:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
фургон
источник
16

Начиная с Rails 4.2 вы можете использовать его truncateнепосредственно в соединении ActiveRecord :

ActiveRecord::Base.connection.truncate(:table_name)

Это стирает все данные и сбрасывает счетчики автоинкремента в таблице. Работает в MySQL и Postgres, не работает в Sqlite.

Борама
источник
10

Добавьте 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
кикито
источник
6

Я использую Rails 4.2.0 и Sqlite3

Вот что у меня сработало (взяв немного из всего вышеперечисленного):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

Затем я смог добавить новые записи в свою таблицу с индексом, начиная с 1

скпланкерин
источник
1

Для всех, кто ищет ответ на этот вопрос, когда базой данных является Postgres, вы можете сделать это из консоли Rails:

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

Где accountsв accounts_id_seq- это имя таблицы.

Мэтт Лонг
источник