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


86

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

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'")

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


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')

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}")

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.


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

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.