Ich möchte, dass die Primärschlüsselwerte wieder bei 1 beginnen.
Antworten:
Um den Index / Primärschlüssel in SQLite zurückzusetzen, geben Sie einfach Folgendes ein:
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")
und es funktionierte, weil es mir einen Fehler gab, der sagte sqlite_sequence where name = 'yourtablename' is not a valid table name
oder so etwas.
Viele Leute (wie ich) kommen hierher, um herauszufinden, wie alle Daten in der Tabelle gelöscht werden können. Bitte schön:
$ rails console
> ModelName.delete_all
oder
> ModelName.destroy_all
destroy_all überprüft Abhängigkeiten und Rückrufe und dauert etwas länger. delete_all ist eine reine SQL-Abfrage.
Weitere Informationen hier: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
Ich habe Folgendes von der Rails-Konsole verwendet, um alles in der Tabelle zu löschen und dann den Indexzähler zurückzusetzen (Ruby 2 & Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_name
Befehl im Reset Plural sein muss, wie der tatsächliche Name der Tabelle, NICHT der singuläre Name des Modells.
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.
Seit Rails 4.2 können Sie truncate
direkt auf einer ActiveRecord-Verbindung verwenden :
ActiveRecord::Base.connection.truncate(:table_name)
Dadurch werden alle Daten gelöscht und die Zähler für die automatische Inkrementierung in der Tabelle zurückgesetzt. Funktioniert in MySQL und Postgres, funktioniert nicht in SQLite.
Fügen Sie gem 'database_cleaner'
Ihrem Gemfile hinzu, führen Sie es aus $ bundle install
und dann:
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
Sie können weitere Tabellen angeben:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
Wenn Sie den letzten Parameter weglassen, wird die gesamte Datenbank abgeschnitten:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
Ich benutze Rails 4.2.0 und Sqlite3
Folgendes hat bei mir funktioniert (ein bisschen von all dem oben Genannten):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
Ich konnte dann neue Datensätze zu meiner Tabelle hinzufügen, wobei der Index bei 1 begann
Wenn Sie nach einer Antwort auf diese Frage suchen, wenn die Datenbank Postgres ist, können Sie dies über die Rails-Konsole tun:
rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Wobei das accounts
in der accounts_id_seq
der Name der Tabelle ist.
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )