Voglio che i valori della chiave primaria ricominciano da 1.
Risposte:
Per ripristinare l'indice / chiave primaria in SQLite basta digitare:
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")e ha funzionato perché mi avrebbe dato un errore che diceva sqlite_sequence where name = 'yourtablename' is not a valid table nameo qualcosa del genere.
Molte persone (come me) vengono qui per scoprire come eliminare tutti i dati nella tabella. Ecco qui:
$ rails console
> ModelName.delete_all
o
> ModelName.destroy_all
distruggere_all controlla dipendenze e callback e impiega un po 'più di tempo. delete_all è una semplice query SQL.
Maggiori informazioni qui: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
Ho utilizzato quanto segue dalla console di rails per eliminare tutto nella tabella e quindi ripristinare il contatore dell'indice (Ruby 2 e Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_namecomando di reset deve essere plurale, come il nome effettivo della tabella NON il nome singolare del modello.
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
A partire da Rails 4.2 puoi usare truncatedirettamente su una connessione ActiveRecord :
ActiveRecord::Base.connection.truncate(:table_name)
Questo cancella tutti i dati e reimposta i contatori di incremento automatico nella tabella. Funziona in MySQL e Postgres, non funziona in Sqlite.
Aggiungi gem 'database_cleaner'al tuo Gemfile, esegui $ bundle installe poi:
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
Puoi specificare più tabelle:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
Se lasci fuori l'ultimo parametro, troncerà l'intero database:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
Sto usando Rails 4.2.0 e Sqlite3
Ecco cosa ha funzionato per me (prendendo un po 'da tutto quanto sopra):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
Sono stato quindi in grado di aggiungere nuovi record alla mia tabella con l'indice che inizia da 1
Per chiunque altro cerchi la risposta a questa domanda quando il database è Postgres, puoi farlo dalla console di Rails:
rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Dove accountsin accounts_id_seqè il nome della tabella.
Person.connection.execute('delete from people' )Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )