Wie setze ich eine einzelne Tabelle in Schienen zurück?

86

Ich möchte, dass die Primärschlüsselwerte wieder bei 1 beginnen.

Yukas
quelle

Antworten:

27

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'")
Rick
quelle
1
Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
Lassen Sie sich
1
Falls jemand dies versuchte und einen Fehler bekam, tat ich es 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 nameoder so etwas.
l1zZY
180

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

Flaviu
quelle
14
Diese Lösung setzt die Tabelleneinträge zurück, jedoch nicht den Primärschlüssel.
Justin D.
4
Ja das ist toll - aber ich möchte den Index zurücksetzen! Weder delete_all noch destroy_all setzen den Index auf 1 zurück.
Kyle Clegg
Diese Antwort löste die Frage der Mehrheit der Benutzer, die sie erreichten. Darauf kommt es wirklich an. Abgesehen davon ist es nicht die einzige Antwort und es wird nicht als die richtige markiert. Der Autor erklärte auch seine Absicht. Ich sehe also kein Problem.
Edison Machado
45

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')
Meltemi
quelle
3
Das hat bei mir sehr gut funktioniert, aber ein kleines Detail ist, dass Ihr model_nameBefehl im Reset Plural sein muss, wie der tatsächliche Name der Tabelle, NICHT der singuläre Name des Modells.
Eli Duke
Funktioniert auch mit der symbolischen Version : ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice
18

@ khellls Link ist hilfreich. Der Befehl, mit dem Sie eine Tabelle abschneiden möchten, lautet:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
Vansan
quelle
16

Seit Rails 4.2 können Sie truncatedirekt 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.

BoraMa
quelle
10

Fügen Sie gem 'database_cleaner'Ihrem Gemfile hinzu, führen Sie es aus $ bundle installund 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
Kikito
quelle
6

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

Skplunkerin
quelle
1

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 accountsin der accounts_id_seqder Name der Tabelle ist.

Matt Long
quelle