2012-01-13 43 views
11

在我的移民,我有:如何重置ActiveRecord迁移中的自动​​增量字段?

def up 
    MyModel.destroy_all 
    MyModel.create!({:id=>1,:name=>'foo'}) 
    MyModel.create!({:id=>2,:name=>'fooBar'}) 
    MyModel.create!({:id=>3,:name=>'fooNull'}) 
end 

,因为我需要重写,这是已经在my_models表数据

但即使我在MySQL指定id继续从该位置编号它已经是。

我需要在id的自动增量上休息计数器,使其只有这3个新记录通过我的Ruby on Rails应用程序上的Active Record迁移。

回答

23

您有2个单独的问题。一种是你试图用质量指定来指定id,rails不允许你这样做。请参阅Overriding id on create in ActiveRecord以获取相关信息。

另一个问题是自动增量未被重置。每个数据库管理系统都有独特的设置增量计数器的方式,虽然它为其中的一些(不是MySQL)实现,但是rails并没有给你一种通用的访问方式,参见Rails way to reset seed on id field

所以你需要运行此MySQL的特定的SQL,这是一样的东西:

ALTER TABLE my_models AUTO_INCREMENT = 1; 

(如果没有任何1)本应在表中最大的ID后重置次数

4

如果你是使用PostgreSQL你可以简单地做:

ModelName.connection.execute('ALTER SEQUENCE model_name_id_seq RESTART WITH 1') 

例如,重设自动递增字段的用户模型将如下所示:

User.connection.execute('ALTER SEQUENCE users_id_seq RESTART WITH 1') 
+0

MySQL不支持ALTER SEQUENCE – PinnyM 2016-02-12 15:56:06

+1

这适用于Postgres – Xavier 2017-07-27 17:05:08

2

万一别人奇迹如何使用MYSQL做到这一点:这里是一个会在迁移中使用的代码为了重置自动增量表:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1') 
  • foo_bars将表名,其AUTO_INCREMENT要重设。

我想出了这个答案,谢谢this question的回答。

相关问题