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

Mr_*_*zle 15 activerecord rails-migrations ruby-on-rails-3

在我的迁移中,我有:

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

因为我需要覆盖已经在my_models表上的数据

但即使我id在MySQL上指定它,它仍然从它已经存在的位置继续编号.

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

Pin*_*nyM 24

你有两个不同的问题.一个是你试图用质量赋值指定id,rails不允许你这样做.有关执行此操作的方法,请参阅在ActiveRecord中创建覆盖id.

另一个问题是自动增量没有重置.每个DBMS都有一种设置递增计数器的独特方式,rails并没有为您提供访问它们的通用方法,虽然它是针对其中一些(而不是MySQL)实现的,请参阅Rails方法在id字段上重置种子

因此,您需要为此运行MySQL特定的SQL,如下所示:

ALTER TABLE my_models AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*G2k 12

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

ModelName.connection.execute('ALTER SEQUENCE model_name_id_seq RESTART WITH 1')
Run Code Online (Sandbox Code Playgroud)

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

User.connection.execute('ALTER SEQUENCE users_id_seq RESTART WITH 1')
Run Code Online (Sandbox Code Playgroud)


Nei*_*eil 5

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

ActiveRecord::Base.connection.execute('ALTER TABLE foo_bars AUTO_INCREMENT = 1')
Run Code Online (Sandbox Code Playgroud)
  • foo_bars要重设其auto_increment的表名在哪里。

由于这个问题的答案,我得以解决