如何重置Rails中的单个表?


Answers:


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 2015年

184

很多人(像我一样)来这里查找如何删除表中的所有数据。干得好:

$ rails console

> ModelName.delete_all

要么

> ModelName.destroy_all

destroy_all检查依赖项和回调,并花费更长的时间。delete_all是直接的SQL查询。

此处提供更多信息:http : //apidock.com/rails/ActiveRecord/Base/delete_all/class


14
此解决方案重置表条目,但不重置主键。
贾斯汀D.

4
是的,这很棒-但我想重置索引!delete_all或destroy_all都没有将索引重置为1。–
Kyle Clegg

这个答案解决了达到此问题的大多数用户的问题。那才是真正重要的。除此之外,这不是唯一的答案,也没有标记为正确的答案。作者还解释了他的意图。所以我没看到任何问题。
Edison Machado

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)
克里斯·西里菲斯

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

accountsaccounts_id_seq是表的名称。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.