我在Rails 5.2.1 + MySQL 5.7.23上创建了一个MySQL表单,并收到了一个错误消息:"Field 'date‘没有默认值“。
我已经做了一些googling,并且我知道,每当我们尝试在没有默认值的列中插入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;我能做些什么来解决这个问题?如有任何建议,将不胜感激。谢谢。
发布于 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模式,请运行以下查询:
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;https://stackoverflow.com/questions/52574619
复制相似问题