Chcę, aby wartości klucza podstawowego ponownie zaczynały się od 1.
ruby-on-rails
yukas
źródło
źródło
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'")
i zadziałało, ponieważ dałoby mi to błąd, który powiedziałsqlite_sequence where name = 'yourtablename' is not a valid table name
lub coś takiego.Wiele osób (takich jak ja) przychodzi tutaj, aby dowiedzieć się, jak usunąć wszystkie dane w tabeli. Proszę bardzo:
$ rails console > ModelName.delete_all
lub
> ModelName.destroy_all
destru_all sprawdza zależności i wywołania zwrotne i trwa trochę dłużej. delete_all to proste zapytanie SQL.
Więcej informacji tutaj: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
źródło
Użyłem następujących poleceń z konsoli railsów, aby usunąć wszystko z tabeli, a następnie zresetować licznik indeksu (Ruby 2 i Rails 4):
> ModelName.delete_all > ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
źródło
model_name
w poleceniu resetowania musi być liczba mnoga, jak rzeczywista nazwa tabeli, a nie pojedyncza nazwa modelu.ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.Link @ khelll jest pomocny. Polecenie, które chcesz obciąć jedną tabelę, to:
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
źródło
Od Railsów 4.2 możesz używać
truncate
bezpośrednio na połączeniu ActiveRecord :ActiveRecord::Base.connection.truncate(:table_name)
Spowoduje to wyczyszczenie wszystkich danych i zresetowanie liczników autoinkrementacji w tabeli. Działa w MySQL i Postgres, nie działa w Sqlite.
źródło
Dodaj
gem 'database_cleaner'
do swojego Gemfile, uruchom$ bundle install
, a następnie:> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
Możesz określić więcej tabel:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
Jeśli opuścisz ostatni parametr, spowoduje to obcięcie całej bazy danych:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
źródło
Używam Rails 4.2.0 i Sqlite3
Oto, co zadziałało dla mnie (biorąc trochę z powyższego):
$ rails c > ModelName.delete_all > ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
Wtedy mogłem dodawać nowe rekordy do mojej tabeli z indeksem zaczynającym się od 1
źródło
Dla każdego, kto szuka odpowiedzi na to pytanie, gdy bazą danych jest Postgres, możesz to zrobić z konsoli Rails:
rails console irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Gdzie
accounts
waccounts_id_seq
jest nazwa tabeli.źródło