15

我创建了一个新的迁移,其中提到

...
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')

我错过了什么吗?我将此迷你应用程序发送给我的一个朋友,他能够成功运行它 -> 记录在数据库中创建。

我错过了什么?

4

2 回答 2

17

我刚刚在 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. 打开严格模式会引发异常。

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

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

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

于 2013-05-13T20:14:20.183 回答
5

要添加到 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"
于 2015-11-06T19:19:42.357 回答