如何在ActiveRecord迁移中重置自动增量字段?

时间:2012-01-13 16:28:21

标签: ruby-on-rails-3 activerecord rails-migrations

在我的迁移中,我有:

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的自动增量上,以便在我的Ruby on Rails应用程序上通过Active Record迁移只有这3个具有该id值的新记录。

4 个答案:

答案 0 :(得分:24)

您有两个不同的问题。一个是你试图用质量赋值指定id,rails不允许你这样做。请参阅Overriding id on create in ActiveRecord了解相关方法。

另一个问题是自动增量没有重置。每个DBMS都有一种设置递增计数器的独特方式,rails并没有为您提供访问它们的通用方法,尽管它是针对其中一些(而不是MySQL)实现的,请参阅Rails way to reset seed on id field

所以你需要为此运行MySQL特定的SQL,类似于:

ALTER TABLE my_models AUTO_INCREMENT = 1;

这应该重置为表格中最大id之后的数字(如果没有,则为1)

答案 1 :(得分:9)

如果您正在使用PostgreSQL,您可以这样做:

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

例如,重置用户模型的自动增量字段如下所示:

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

答案 2 :(得分:4)

如果有其他人想知道如何使用MYSQL执行此操作:这是在迁移中使用的代码,以便重置表的自动增量:

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1')
  • 其中foo_bars是您要重置其auto_increment的表名。

由于this question的回答,我想出了这个。

答案 3 :(得分:0)

对于 sqlite3,它将是:

ActiveRecord::Base.connection.execute('delete from sqlite_sequence where name="your_tablename"')