Bagaimana cara mengatur ulang satu tabel di rel?

86

Saya ingin nilai kunci utama dimulai dari 1 lagi.

yukas
sumber

Jawaban:

27

Untuk mengatur ulang indeks / kunci utama di SQLite cukup ketik:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
Rick
sumber
1
mengambil inspirasi dari jawaban Anda ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye
1
Jika ada yang mencoba ini dan mendapat kesalahan, saya melakukannya ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")dan itu berhasil karena itu akan memberi saya kesalahan yang mengatakan sqlite_sequence where name = 'yourtablename' is not a valid table nameatau sesuatu seperti itu.
l1zZY
185

Banyak orang (seperti saya) datang ke sini untuk mencari cara menghapus semua data di tabel. Ini dia:

$ rails console

> ModelName.delete_all

atau

> ModelName.destroy_all

destroy_all memeriksa dependensi dan callback, dan membutuhkan waktu lebih lama. delete_all adalah kueri SQL langsung.

Info lebih lanjut di sini: http://apidock.com/rails/ActiveRecord/Base/delete_all/class

Flaviu
sumber
14
Solusi ini mereset entri tabel, tetapi bukan kunci utama.
Justin D.
4
Ya ini bagus - tapi saya ingin mengatur ulang indeks! Baik delete_all atau destroy_all tidak menyetel ulang indeks menjadi 1.
Kyle Clegg
Jawaban ini memecahkan pertanyaan mayoritas pengguna yang mencapainya. Itulah yang terpenting. Selain itu, ini bukan satu-satunya jawaban dan tidak ditandai sebagai jawaban yang benar. Penulis pun menjelaskan maksudnya. Jadi saya tidak melihat ada masalah.
Edison Machado
45

Saya telah menggunakan perintah berikut dari rails console untuk menghapus semua yang ada di tabel dan kemudian mengatur ulang penghitung indeks (Ruby 2 & Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
Meltemi
sumber
3
Ini bekerja sangat baik untuk saya, tetapi detail kecilnya adalah bahwa model_nameperintah reset Anda harus jamak, seperti nama sebenarnya dari tabel BUKAN nama tunggal model.
Eli Duke
Juga bekerja dengan versi simbolik: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice
18

Tautan @ khelll sangat membantu. Perintah yang ingin Anda potong satu tabel adalah:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")
van
sumber
16

Sejak Rails 4.2 Anda dapat menggunakan truncatesecara langsung pada koneksi ActiveRecord :

ActiveRecord::Base.connection.truncate(:table_name)

Ini akan menghapus semua data dan menyetel ulang penghitung kenaikan otomatis di tabel. Bekerja di MySQL dan Postgres, tidak berfungsi di Sqlite.

BoraMa
sumber
10

Tambahkan gem 'database_cleaner'ke Gemfile Anda, jalankan $ bundle install, lalu:

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])

Anda dapat menentukan lebih banyak tabel:

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])

Jika Anda meninggalkan parameter terakhir, itu akan memotong seluruh database:

> DatabaseCleaner.clean_with(:truncation) # your database is truncated
kikito
sumber
6

Saya menggunakan Rails 4.2.0 dan Sqlite3

Inilah yang berhasil untuk saya (mengambil sedikit dari semua hal di atas):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

Saya kemudian dapat menambahkan catatan baru ke tabel saya dengan indeks mulai dari 1

skplunkerin
sumber
1

Bagi siapa pun yang mencari jawaban untuk pertanyaan ini ketika database-nya adalah Postgres, Anda dapat melakukan ini dari konsol Rails:

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

Dimana accountsdi dalam accounts_id_seqadalah nama tabel.

Matt Long
sumber