Làm thế nào để đặt lại một bảng duy nhất trong đường ray?


86

Tôi muốn các giá trị khóa chính bắt đầu lại từ 1.

Câu trả lời:


27

Để đặ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'")

1
lấy cảm hứng từ câu trả lời của bạn ...Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
mamesaye

1
Trong trường hợp bất kỳ ai đã thử điều này và gặp lỗi, tôi đã làm 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 namehoặc đại loại như vậy.
l1zZY

184

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


14
Giải pháp này đặt lại các mục nhập của bảng, nhưng không đặt lại khóa chính.
Justin D.

4
Vâng, điều này thật tuyệt - nhưng tôi muốn đặt lại chỉ mục! Cả delete_all hoặc destroy_all được đặt lại chỉ mục để 1.
Kyle Clegg

Câu trả lời này đã giải quyết câu hỏi của đa số người dùng đã tiếp cận nó. Đó là điều thực sự quan trọng. Ngoài ra, đó không phải là câu trả lời duy nhất và nó không được gắn cờ là câu trả lời đúng. Tác giả cũng giải thích ý định của mình. Vì vậy tôi không thấy có vấn đề gì.
Edison Machado

45

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

3
Điều này thực sự hiệu quả đối với tôi, nhưng một chi tiết nhỏ là model_nametrong 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.
Eli Duke

Cũng làm việc với phiên bản mang tính biểu tượng: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice

18

Liên kết của @ khelll rất hữu ích. Lệnh bạn muốn cắt bớt một bảng là:

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

16

Kể từ Rails 4.2, bạn có thể sử dụng truncatetrự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đặ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.


10

Thêm gem 'database_cleaner'vào Gemfile của bạn, chạy $ bundle installvà 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

6

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


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 accountstrong accounts_id_seqlà tên của bảng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.