Bagaimana cara mengatur ulang satu tabel di rel?


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

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


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

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

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.


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

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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.