mysql - rails 3.2 + MySQL : Error: Field 'created_at' doesn't have a default value: INSERT INTO

标签 mysql ruby-on-rails ruby timestamp 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 发给了我的一个 friend ,他能够成功运行 -> 在数据库中创建了记录。

我错过了什么?

最佳答案

我刚刚在 Mac OS 上全新安装 MySql 时遇到了类似的情况。

我最终将其缩小到默认情况下打开“严格模式”的较新版本的 MySql 的组合,以及我的项目有一个带有一些可疑约束的表。有问题的表是 :has_and_belongs_to_many 关系中使用的“连接表”。不知何故,该表是使用 :created_at:updated_at 属性创建的,这些属性对它们有 :null => false 的约束。 Rails 3.2 不会自动为 :habtm 关系的连接表填充时间戳字段。当关闭严格模式时,MySql 只会用归零的日期填充列,例如 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

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

关于mysql - rails 3.2 + MySQL : Error: Field 'created_at' doesn't have a default value: INSERT INTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16199710/

相关文章:

ruby-on-rails - 使用 Procfile 部署到 dokku 会干扰 'dokku run'

ruby-on-rails - 您会推荐哪种基于 ruby​​ 的论坛软件来集成到现有的 Rails 应用程序中?

ruby-on-rails - rails : check if the model was really saved in after_save

ruby-on-rails - 如何使用 net-ssh gem 跟踪 ssh 进入系统所需的时间

ruby - 使用 rvm 和 git,我可以将 ruby​​ 版本与每个分支相关联吗?

php - 如何在codeigniter中基于关联实体获取数据

c# - MVC 3 C# - 部署和 MYSQL 数据库

ruby-on-rails - 如何验证 Rails 3 中没有属性?

php - 存储未知长度的数组

php - 增加 phpmyadmin 中的文件大小限制