Я хочу, чтобы значения первичного ключа снова начинались с 1.
ruby-on-rails
юкас
источник
источник
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
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
команда сброса должна иметь множественное число, например, фактическое имя таблицы, а НЕ единственное имя модели.ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.Ссылка @ khelll полезна. Команда, которую вы хотите усечь одну таблицу:
ActiveRecord::Base.connection.execute("TRUNCATE #{table_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
источник
Для всех, кто ищет ответ на этот вопрос, когда базой данных является Postgres, вы можете сделать это из консоли Rails:
rails console irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Где
accounts
вaccounts_id_seq
- это имя таблицы.источник