不为null,但仍显示“字段'date'没有默认值”

时间:2018-09-30 04:28:55

标签: mysql ruby-on-rails

我正在Rails 5.2.1 + MySQL 5.7.23上创建一个date_field表单,但收到一条错误消息,提示“字段'date'没有默认值”。
我已经进行了一些谷歌搜索,并且了解到每当我们尝试将null插入没有默认值的列时,都会在MySQL 5.6+上出现此错误。 但是,就我而言,我选择的日期不能为空,并且仍然出现相同的错误。

我的new.erb:

<%= 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;

该如何解决?任何建议,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

这是由STRICT_TRANS_TABLES MySQL模式引起的。来自MySQL 5.7 Documentation

  

严格模式控制MySQL如何处理invalid或缺少的值   数据更改语句,例如INSERT或UPDATE。值可以是   无效有几个原因。例如,它可能有错误的数据   列的类型,否则可能超出范围。缺少值   当要插入的新行不包含非NULL值时   定义中没有明确的DEFAULT子句的列。 (为一个   NULL列,如果缺少该值,则插入NULL。)严格模式   还会影响DDL语句,例如CREATE TABLE。

     

如果严格模式无效,则MySQL会为   无效或缺失的值并产生警告(请参阅部分   13.7.5.40,“ SHOW警告语法”。在严格模式下,可以通过使用INSERT IGNORE或UPDATE IGNORE来产生此行为。

     

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

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

SHOW VARIABLES LIKE 'sql_mode';

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

SET GLOBAL sql_mode='';

OR

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;