mysql - 不为空但仍然得到“字段'日期'没有默认值”
问题描述
我正在date_field
Rails 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;
我能做些什么来解决这个问题?任何建议,将不胜感激。谢谢。
解决方案
这是由STRICT_TRANS_TABLES
MySQL 模式引起的。来自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;
推荐阅读
- python - pyspark json读取忽略空集
- javascript - 导出多个带参数的函数
- mysql - 如何在mysql usinf while循环中插入日期时间值
- flutter - 在 Dart 的主线程中强制执行
- python - 如何修复“列表索引超出范围”
- flutter - 当用户在谷歌地图上按下标记时如何显示 spinkit?(flutter_spinkit)
- django - 更改显示记录在数据库中的显示方式
- jenkins - 如何将 Jenkins 作业中的人工制品自动复制到给定的网络驱动器中?
- firebase - Firebase:如何批量发送推送通知以避免后端过载问题?
- c# - 如何为 Task.WhenAll 捆绑异步任务?