Quero que os valores da chave primária comecem de 1 novamente.
Respostas:
Para redefinir o índice / chave primária no SQLite, basta digitar:
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")
e funcionou porque me daria um erro que disse sqlite_sequence where name = 'yourtablename' is not a valid table name
ou algo parecido.
Muitas pessoas (como eu) vêm aqui para descobrir como deletar todos os dados da tabela. Aqui está:
$ rails console
> ModelName.delete_all
ou
> ModelName.destroy_all
destroy_all verifica dependências e retornos de chamada e leva um pouco mais de tempo. delete_all é uma consulta SQL direta.
Mais informações aqui: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
Tenho usado o seguinte no console do Rails para excluir tudo na tabela e, em seguida, redefinir o contador de índice (Ruby 2 e Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_name
no comando reset precisa para o plural, como o nome real da tabela NÃO o nome singular do modelo.
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.
Desde Rails 4.2 você pode usar truncate
diretamente em uma conexão ActiveRecord :
ActiveRecord::Base.connection.truncate(:table_name)
Isso limpa todos os dados e zera os contadores de incremento automático na tabela. Funciona em MySQL e Postgres, não funciona em Sqlite.
Adicione gem 'database_cleaner'
ao seu Gemfile, execute $ bundle install
e:
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
Você pode especificar mais tabelas:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
Se você deixar o último parâmetro de fora, ele truncará todo o banco de dados:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
Estou usando Rails 4.2.0 e Sqlite3
Aqui está o que funcionou para mim (considerando um pouco de todos os itens acima):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
Consegui então adicionar novos registros à minha tabela com o índice começando em 1
Para qualquer pessoa que esteja procurando uma resposta para essa pergunta quando o banco de dados for Postgres, você pode fazer isso no console do Rails:
rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Onde o accounts
em accounts_id_seq
é o nome da tabela.
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )