2013-04-24 49 views
13

我創建新的遷移,其中在所創建的表中提到滑軌3.2 + MySQL的:錯誤:字段「created_at」不具有默認值:INSERT INTO

... 
t.timestamps 

加入這兩列

... 
| created_at | datetime | NO (Null) |  | NULL (Default) |     
| updated_at | datetime | NO (Null) |  | NULL (Default) | 
... 

當我想創建一個新的項目,我總是得到錯誤信息

Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO `table_name` (`first_col`, `second_col`) VALUES ('a', 'b') 

我缺少的東西?我將這個miniapp發送給我的一個朋友,他能夠成功運行它 - >該記錄在數據庫中創建。

我錯過了什麼?

+0

你如何創建新的項目? – ericeason 2013-04-24 18:57:51

+0

'@photo = Photo.new(PARAMS [:照片])'...'@ photo.save' – user984621 2013-04-24 19:17:20

回答

16

我只是碰到了一個新的類似的MySQL的Mac OS上的安裝。

我終於把範圍縮小到MySql開啓「嚴格模式」在默認情況下,以及具有它的一些可疑約束的表我的項目的較新版本的組合。有問題的表格是:has_and_belongs_to_many關係中使用的「連接表」。不知怎的,該表已與:created_at創建,:updated_at屬性,這些屬性具有:null => false對他們的約束。 Rails 3.2不會自動爲:habtm關係的連接表填充時間戳字段。當嚴格模式關閉時,MySql將只填充cols和零日期日期,如0000-00-00 00:00:00。在嚴格模式打開的情況下引發異常。

要解決我跑遷移到允許時間戳字段爲空的問題。就像這樣:

class ChangeNullableForTimestampsOnThing1sThing2s < ActiveRecord::Migration 
    def up 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => true) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => true) 
    end 

    def down 
    change_column(:thing1s_thing2s, :created_at, :datetime, :null => false) 
    change_column(:thing1s_thing2s, :updated_at, :datetime, :null => false) 
    end 
end 

老實說,這可能會更好剛落列,如果你不需要他們,但我們有一對夫婦,他們實際上得到手動設置特殊情況。

+1

非常有幫助謝謝。我希望他們很快解決這個問題。以下是關於這個問題的更多討論:https://github.com/rails/rails/issues/10307 – 2013-07-04 21:50:31

4

添加傑里米的答案,在Mac系統中,你可以刪除嚴格模式

> vi /usr/local/opt/mysql/my.cnf 

然後更換

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"