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.