2012-06-01 50 views
2

當我創建表用戶時,生成的表有一個名爲id的列,定義爲一個整數。RAILS:DB MIGRATION:將id列重置爲auto_increment

我試圖修改它以BIGINT,無符號如下:

change_column :users, :id, :integer, :limit => 8, :unsigned => true 

哪件事改變爲bigint,但它不再是一個自動增量列(儘管它仍然確定爲主要指標,並且還沒有設置爲無符號(即使軌告訴我,遷移執行罰款)

話,我想這樣做:

change_column :users, :id, :integer, :limit => 8, :unsigned => true, :null => false, :auto_increment => true 

Rails的說,遷移執行得很好,但沒有任何改變。

我可以嘗試像:

change_column :users, :id, :primary_index 

但會把我的權利,我開始

我也可以嘗試「執行」的聲明與MySQL的代碼,但我想保留遷移文件「乾淨」。有沒有人遇到過這個問題?

另外,我還試圖在另一列設置默認爲NULL,在這裏研究它(和Google),但沒有成功。

編輯:

看起來好像是沒有辦法編輯列「ID」它是作爲創建表的一部分,通過一個普通的遷移創建後。唯一的方法是通過一個帶有MySQL語法的「execute」語句。

回答

0

Rails正在照顧您所創建的所有表的ID字段,它對您的遷移甚至是從schema.rb文件中隱藏。

所以我建議你退後一步,想一想:你爲什麼要惹惱它?你確定這真的需要嗎?

編輯:This answer似乎正是你在找什麼。

關於「設置默認值爲NULL」,再次,爲什麼要這樣做?無論如何,所有列都默認爲NULL。但是,如果情況並非如此,您可以在遷移時執行此操作:

change_table :users do |t| 
    t.string :description, :default => nil 
end 

希望能夠回答您的問題。

+0

使用默認ID字段設置的問題,就在於它是一個整數值,設定爲簽署,這意味着我限於值高達2,147,483,647。 這可能看起來像一個非常大的數字,但我正在處理社交網絡數據,每天有數千萬條記錄(它們最終被歸檔,但我需要維護ID號)。 所以,我需要使它成爲一個bigint,無符號的,它給了我高達18,446,744,073,709,551,615(例如,推特Twitter提供它的推特ID爲bigint,無符號)。 – EastsideDeveloper

+0

我明白,默認情況下,默認值是NULL,但在這種情況下,我不小心改變了它,並且想知道,在刪除列並重新創建它之後,如果有方法將默認值更改回null 。我已經嘗試過:default => false,但它會生成0而不是NULL。 – EastsideDeveloper

+0

關於默認選項,我犯了一個意外錯誤。它現在得到糾正,你可以嘗試嗎? – Agis

1

嘗試建立並運行此遷移:

class ChangeColumnUserIdToAutoIncrement < ActiveRecord::Migration 

    def self.up 
    execute "ALTER TABLE users modify COLUMN id int(8) AUTO_INCREMENT" 
    end 

    def self.down 
    execute "ALTER TABLE users modify COLUMN id int(8)" 
    end 
end