Rails 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发送给我的一个朋友,他能够成功运行它 – >记录是在数据库中创建的。

我错过了什么?

我刚刚在Mac OS上全新安装MySql时碰到了类似的东西。

我最后将它缩小为默认情况下启用“严格模式”的新版MySql的组合,并且我的项目有一个表格,其上有一些可疑的约束。 有问题的表是:has_and_belongs_to_many关系中使用的“连接表”。 不知何故,该表是使用:created_at:updated_at属性创建的,它们的约束为:null => false 。 Rails 3.2不会自动填充:habtm关系的连接表的时间戳字段。 当严格模式关闭时,MySql将填充带有清零日期的cols,例如0000-00-00 00:00:00 。 打开严格模式会引发exception。

为了解决这个问题,我运行了一个迁移,允许时间戳字段为空。 像这样:

 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 

老实说,如果您不需要它们,最好只删除列,但我们有一些特殊情况,它们实际上是手动设置的。

添加到Jeremy的答案,在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" 
Interesting Posts