Як скинути одну таблицю в рейках?


86

Я хочу, щоб значення первинного ключа знову починалися з 1.

Відповіді:


27

Щоб скинути індекс / первинний ключ у SQLite, просто введіть:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

1
Person.connection.execute('delete from people' ) Person.connection.execute("update sqlite_sequence set seq = 0 where name = 'People'" )
черпаючи

1
Якщо хтось спробував це і отримав помилку, я це зробив, ActiveRecord::Base.connection.execute("DELETE from 'yourtablename'")і це спрацювало, тому що це дало б мені помилку, в якій було сказано, sqlite_sequence where name = 'yourtablename' is not a valid table nameабо щось подібне.
l1zZY

184

Багато людей (як я) приходять сюди, щоб знайти, як видалити всі дані в таблиці. Ось:

$ rails console

> ModelName.delete_all

або

> ModelName.destroy_all

kill_all перевіряє залежності та зворотні виклики, і займає трохи більше часу. delete_all - це прямий запит SQL.

Більше інформації тут: http://apidock.com/rails/ActiveRecord/Base/delete_all/class


14
Це рішення скидає записи в таблиці, але не первинний ключ.
Джастін Д.

4
Так, це чудово - але я хочу скинути індекс! Ні delete_all, ні delete_all не скидають індекс до 1.
Kyle Clegg

Ця відповідь вирішила питання більшості користувачів, які її дійшли. Це те, що насправді має значення. Крім того, це не єдина відповідь, і вона не позначена як правильна. Автор також пояснив свій намір. Тому я не бачу жодної проблеми.
Едісон Мачадо,

45

Я використовував наступне з консолі rails, щоб видалити все в таблиці, а потім скинути лічильник індексів (Ruby 2 & Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

3
Це дуже добре спрацювало для мене, але невелика подробиця полягає в тому, що model_nameв команді reset потрібно вживати множину, як власне назва таблиці, НЕ окреме ім'я моделі.
Елі Дюк

Також працює з символічною версії: ActiveRecord::Base.connection.reset_pk_sequence!(:plural_model_name).
Chris Cirefice

18

Посилання @ khelll є корисним. Команда, яку потрібно скоротити для однієї таблиці:

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

16

Оскільки Rails 4.2 ви можете використовувати truncateбезпосередньо для підключення ActiveRecord :

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

Це знищує всі дані та скидає лічильники автоінкрементів у таблиці. Працює в MySQL і Postgres, не працює в Sqlite.


10

Додайте gem 'database_cleaner'до свого Gemfile, запустіть $ bundle install, а потім:

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

Ви можете вказати більше таблиць:

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

Якщо залишити останній параметр, він усіче базу даних:

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

6

Я використовую Rails 4.2.0 та Sqlite3

Ось, що мені вдалося (взявши трохи з усього вищесказаного):

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

Потім я зміг додати нові записи до своєї таблиці з індексом, починаючи з 1


1

Для тих, хто шукає відповіді на це питання, коли база даних Postgres, ви можете зробити це за допомогою консолі Rails:

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

Де accountsin accounts_id_seq- це назва таблиці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.