Jak zresetować pojedynczy stół w szynach?

86

Chcę, aby wartości klucza podstawowego ponownie zaczynały się od 1.

yukas
źródło

Odpowiedzi:

27

Aby zresetować indeks / klucz podstawowy w SQLite, po prostu wpisz:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
Stóg
źródło
1
czerpiąc inspirację z Twojej odpowiedzi ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye
1
Na wypadek, gdyby ktoś spróbował tego i dostał błąd, zrobiłem 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 namelub coś takiego.
l1zZY
184

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

Flaviu
źródło
14
To rozwiązanie resetuje wpisy tabeli, ale nie resetuje klucza podstawowego.
Justin D.
4
Tak, to jest świetne - ale chcę zresetować indeks! Ani delete_all, ani destru_all nie resetują indeksu do 1.
Kyle Clegg
Ta odpowiedź rozwiązała pytanie większości użytkowników, którzy do niej dotarli. To się naprawdę liczy. Poza tym to nie jedyna odpowiedź i nie jest oznaczona jako poprawna. Autor wyjaśnił również swój zamiar. Więc nie widzę żadnego problemu.
Edison Machado,
45

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')
Meltemi
źródło
3
To zadziałało dla mnie naprawdę dobrze, ale drobnym szczegółem jest to, że model_namew poleceniu resetowania musi być liczba mnoga, jak rzeczywista nazwa tabeli, a nie pojedyncza nazwa modelu.
Eli Duke
Współpracuje również z wersji symbolicznej ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice
18

Link @ khelll jest pomocny. Polecenie, które chcesz obciąć jedną tabelę, to:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
vansan
źródło
16

Od Railsów 4.2 możesz używać truncatebezpoś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.

BoraMa
źródło
10

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
kikito
źródło
6

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

skplunkerin
źródło
1

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 accountsw accounts_id_seqjest nazwa tabeli.

Matt Long
źródło