2012-01-13 87 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的回答。

相關問題