首页 > 解决方案 > 不为空但仍然得到“字段'日期'没有默认值”

问题描述

我正在date_fieldRails 5.2.1 + MySQL 5.7.23 上创建一个表单,我收到一条错误消息,提示“字段'日期'没有默认值”。
我做了一些谷歌搜索,我知道每当我们尝试将 null 插入没有默认值的列时,我们都会在 MySQL 5.6+ 上收到此错误。但是,就我而言,我选择了一个不为空的日期,但我仍然遇到同样的错误。

我的新人:

<%= form_for @post, :url => {:action => :create} do |f| %>
  <table>
    <tr>
      <th>DATE</th>
      <th>CONTENT</th>
    </tr>
    <tr>
      <td><%= f.date_field :date %></td>
      <td><%= f.text_field :content %></td>
    </tr>
  </table>
  <%= f.submit %>
<% end %>

我的posts_controller.rb:

class PostsController < ApplicationController

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(user_id: current_user.id, date: params[:date], content: params[:content])
    @post.save
    redirect_to('/')
  end

end

我的 MySQL 设置:

CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `date` date NOT NULL,
  `content` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我能做些什么来解决这个问题?任何建议,将不胜感激。谢谢。

标签: mysqlruby-on-rails

解决方案


这是由STRICT_TRANS_TABLESMySQL 模式引起的。来自MySQL 5.7 文档

严格模式控制 MySQL 如何处理数据更改语句(如 INSERT 或 UPDATE)中的无效或缺失值。一个值可能由于多种原因而无效。例如,它可能具有错误的列数据类型,或者可能超出范围。当要插入的新行不包含在其定义中没有显式 DEFAULT 子句的非 NULL 列的值时,缺少值。(对于 NULL 列,如果缺少值,则插入 NULL。)严格模式也会影响 DDL 语句,例如 CREATE TABLE。

如果严格模式无效,MySQL 会为无效或缺失值插入调整值并产生警告(参见第 13.7.5.40 节,“显示警告语法”)。在严格模式下,您可以通过使用 INSERT IGNORE 或 UPDATE IGNORE 来产生这种行为。

对于 SELECT 等不更改数据的语句,无效值会在严格模式下生成警告,而不是错误。

要检查是否STRICT_TRANS_TABLES启用了模式,请运行以下查询:

SHOW VARIABLES LIKE 'sql_mode';

要禁用严格模式,请在建立数据库连接后(在应用程序代码中)调用以下查询:

SET GLOBAL sql_mode='';

或者

SET sql_mode='';

GLOBAL关键字需要超级用户权限,它将确保更改应用于所有连接到服务器的客户端。但是,请注意,该SET GLOBAL方法不会使更改永久化。它只会在 MySQL 服务器没有重新启动之前工作。要使更改永久生效,您必须在mysqld配置文件中进行更改。在较旧的 MySQL 版本中,在 Linux 服务器(例如:Ubuntu)中,有一个配置文件/etc/mysql/mysql.cnf,您可以在其中将这些更改添加到[mysqld]小节下方。

在较新的版本中,例如在 Ubuntu 服务器中,文件将是:/etc/mysql/mysql.conf.d/mysqld.cnf

虽然,您确实应该为表列设置默认值。对于这些日期字段,您可以将默认值设置为null

CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NUL,
  `date` date DEFAULT NULL,
  `content` varchar(255) DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

推荐阅读