在我的迁移中,我有:
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值的新记录。
答案 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"')