我正在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;
该如何解决?任何建议,将不胜感激。谢谢。
答案 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;