Tôi muốn các giá trị khóa chính bắt đầu lại từ 1.
Câu trả lời:
Để đặt lại chỉ mục / khóa chính trong SQLite, chỉ cần nhập:
$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")
ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")
và nó hoạt động bởi vì nó sẽ cho tôi một lỗi đã nói sqlite_sequence where name = 'yourtablename' is not a valid table name
hoặc đại loại như vậy.
Rất nhiều người (như tôi) vào đây để tìm cách xóa tất cả dữ liệu trong bảng. Của bạn đây:
$ rails console
> ModelName.delete_all
hoặc là
> ModelName.destroy_all
kill_all kiểm tra các phụ thuộc và gọi lại, và mất nhiều thời gian hơn một chút. delete_all là một truy vấn SQL đơn giản.
Thông tin thêm tại đây: http://apidock.com/rails/ActiveRecord/Base/delete_all/class
Tôi đã sử dụng phần sau từ bảng điều khiển rails để xóa mọi thứ trong bảng và sau đó đặt lại bộ đếm chỉ mục (Ruby 2 & Rails 4):
> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')
model_name
trong lệnh đặt lại của bạn cần phải ở số nhiều, giống như tên thực của bảng KHÔNG phải tên số ít của mô hình.
ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name)
.
Kể từ Rails 4.2, bạn có thể sử dụng truncate
trực tiếp trên kết nối ActiveRecord :
ActiveRecord::Base.connection.truncate(:table_name)
Thao tác này sẽ xóa tất cả dữ liệu và đặt lại các bộ đếm tự động tăng trong bảng. Hoạt động trong MySQL và Postgres, không hoạt động trong Sqlite.
Thêm gem 'database_cleaner'
vào Gemfile của bạn, chạy $ bundle install
và sau đó:
> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])
Bạn có thể chỉ định thêm bảng:
> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])
Nếu bạn bỏ qua tham số cuối cùng, nó sẽ cắt ngắn toàn bộ cơ sở dữ liệu:
> DatabaseCleaner.clean_with(:truncation) # your database is truncated
Tôi đang sử dụng Rails 4.2.0 và Sqlite3
Đây là những gì đã làm việc cho tôi (lấy một chút từ tất cả những điều trên):
$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")
Sau đó, tôi có thể thêm các bản ghi mới vào bảng của mình với chỉ mục bắt đầu lại từ 1
Đối với bất kỳ ai khác đang tìm kiếm câu trả lời cho câu hỏi này khi cơ sở dữ liệu là Postgres, bạn có thể thực hiện việc này từ bảng điều khiển Rails:
rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")
Trường hợp accounts
trong accounts_id_seq
là tên của bảng.
Person.connection.execute('delete from people' )
Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )