首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不为空,但仍然得到“字段‘日期’没有默认值”

问不为空,但仍然得到“字段‘日期’没有默认值”
EN

Stack Overflow用户
提问于 2018-09-30 04:28:54
回答 1查看 3.4K关注 0票数 2

我在Rails 5.2.1 + MySQL 5.7.23上创建了一个MySQL表单,并收到了一个错误消息:"Field 'date‘没有默认值“。

我已经做了一些googling,并且我知道,每当我们尝试在没有默认值的列中插入null时,就会在MySQL 5.6+上得到这个错误。但是,在我的例子中,我选择的日期使得它不是空的,而且我仍然会得到相同的错误。

我的new.erb:

代码语言:javascript
复制
<%= 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:

代码语言:javascript
复制
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设置:

代码语言:javascript
复制
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;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-30 05:16:23

这是由STRICT_TRANS_TABLES MySQL模式造成的。来自MySQL 5.7文档:

严格模式控制MySQL如何处理数据更改语句(如INSERT或UPDATE )中无效或缺失的值。由于几个原因,值可能无效。例如,它可能具有列的错误数据类型,或者它可能超出了范围。当要插入的新行不包含定义中没有显式默认子句的非空列的值时,将缺少一个值。(对于空列,如果缺少该值,则插入NULL。)严格模式也会影响DDL语句,如CREATE。 如果严格模式无效,MySQL将插入无效或缺失值的调整值,并生成警告(参见13.7.5.40节,“显示警告语法”)。在严格模式下,可以使用插入、忽略或更新忽略来生成此行为。 对于不更改数据的SELECT语句,无效值将在严格模式下生成警告,而不是错误。

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

代码语言:javascript
复制
SHOW VARIABLES LIKE 'sql_mode';

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

代码语言:javascript
复制
SET GLOBAL sql_mode='';

或

代码语言:javascript
复制
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。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52574619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档