问题背景:

线上的linux服务器上的mysql服务器中导出数据库的结构。想要在本地创建一个测试版本

导出后再本地mysql上运行却报错   1067 - Invalid default value for

mysql数据库中需要使用timestamp列来存储数据的创建时间和更新时间

例如,创建后台管理菜单表,只看created_at和updated_at两个字段

DROP TABLE IF EXISTS `admin_menu`;
CREATE TABLE `admin_menu` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` int(11) NOT NULL DEFAULT 0,
`order` int(11) NOT NULL DEFAULT 0,
`title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`uri` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`permission` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` timestamp(0) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 15 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;

执行后发现报错

1067 - Invalid default value for 'updated_at'。updated_at字段的默认值无效。而created_ad字段类型是datetime日期时间类型默认值为NULL没有发生报错

 一开始以为是sql_mode模式问题,然而在sql_mode模式为严格或者宽松模式情况下,都会报错。
本地和线上服务器相同的模式也不行
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
接着,查看线上服务器版本和本地版本对比,
使用select VERSION()
线上mysql版本:5.7.22-log
本地mysql版本:5.7.23-log
版本相差不大,排除版本问题。那只能找资料了。
 
解决方法:
方法1
既然timestamp会报错,就直接用datetime来保存时间就可以解决的。
将updated_at类型timestamp改为datetime,这个创建表的过程能够正常运行
 
方法2
既然不能为NULL,那我改为一个固定值不就可以了吗
`updated_at` timestamp(0) DEFAULT '1970-01-01 08:00:00',
将时间设置为unix时间戳为0对应的日期(默认是1970-01-01 00:00:00,中国时间要加8)。

方法3

网上查找,在mysql配置文件中增加配置参数

[mysqld]节点下添加

explicit_defaults_for_timestamp = ON

重启mysql数据库试配置生效。

之后就可以正常执行上面的数据的

下面是方法三的具体解释,仅作记录,可以不需要知道

网上搜索资料,

mysql5..6之前,timestamp时间类型有一个默认行为:
TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)
insert插入一条数据,TIMESTAMP的列值为NULL,会自动存储时候,会将当前timestamp存储到这个timestamp列中。
也就是说会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
每次更新记录都会将timestamp列更新为当前的时间戳对应的时间值
 
 
现在mysql5.6版本以后,timestamp字段的默认行为发生的变化,多了一些限制。
如果timestamp列设置默认值为NULL,
Default NULL 这会发生报错 1067 - Invalid default value for
 
如果需要让timestamp列在创建表时可以为NULL值,需要将explicit_defaults_for_timestamp设为ON
explicit_defaults_for_timestamp默认为OFF关闭状态,打开后可以阻止timestamp的默认行为。

mysql创建表时,设置timestamp DEFAULT NULL报错1067 - Invalid default value for 'updated_at'的更多相关文章

  1. 导入数据库备份报错1067 – Invalid default value for ‘create_time’

    通过navicat工具导入psc数据库备份文件,报错如下,mysql版本5.7 执行如下语句不通过 DROP TABLE IF EXISTS `guard_user`; CREATE TABLE `g ...

  2. MySQL 创建表时,设置时间字段自己主动插入当前时间

    MySQL 创建表时,设置时间字段自己主动插入当前时间 DROP TABLE IF EXISTS `CONTENT`; CREATE TABLE `CONTENT` ( `ID` char(20) N ...

  3. oracle与mysql创建表时的区别

    oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表CREATE TABLE predict_data as ( id integer ), mid ), time dat ...

  4. mysql 创建表时注意事项

    mysql  创建表时注意事项 mysql 想必大家都不会陌生吧  是我学习中第一个接触的的数据库 已学习就很快上手的   这是一个关系型数据库  不懂什么是关系型数据库 啊哈哈哈  现在知道啦  因 ...

  5. MySQL创建表时加入的约束以及外键约束的的意义

    1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...

  6. Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.

    在本地的一个数据库创建表时意外的出现了以下错误,说是表已经存在了 但通过desc 查看表信息时又说表不存在 在本地系统搜索表名却发现一个.ibd文件[InnoDB File] 在删除了该.ibd文件文 ...

  7. 导入数据库时报错1067 – Invalid default value for ‘字段名’

    最近把mysql升级到5.7了,wordpress导数据报错 Invalid default value for 'comment_date' 原因出在类似这样的语句 DROP TABLE IF EX ...

  8. mysql 约束条件 auto_increment 自动增长 创建表时设置自增字段

    auto_increment mysql) )auto_increment; Query OK, rows affected (0.01 sec) mysql> show create tabl ...

  9. (转)mysql创建表时反引号的作用

    试用navicat工具查看现网mysql建表语句时,发现表名和字段名都是反引号引起来的 CREATE TABLE `tab_notice_title_tv` ( `i_id` int(11) NOT ...

随机推荐

  1. Android,重新出发!

    接触Android差不多一年,工作也有快半年的时间了. 现在回头看看自己写的代码,虽然功能可以实现,但是还是有很多不足的地方. 比如代码结构,一个类中的代码过多,知道这样做不好,但是不知道怎么把这些 ...

  2. Step by Step Guide on Yanhua ACDP Clear BMW EGS ISN

    Yanhua Mini ACDP authorize new function on BMW EGS ISN clearing.So here UOBDII want to share this st ...

  3. 20172325 2018-2019-2 《Java程序设计》第六周学习总结

    20172325 2018-2019-2 <Java程序设计>第六周学习总结 教材学习内容总结 本周学习第十章--树 1.什么是树 (1)树是一种数据结构,与之前学过的栈.队列和列表这些线 ...

  4. boost asio 学习(五) 错误处理

    http://www.gamedev.net/blog/950/entry-2249317-a-guide-to-getting-started-with-boostasio?pg=6 5. Erro ...

  5. JAVA中内部类(匿名内部类)访问的局部变量为什么要用final修饰?

    本文主要记录:在JAVA中,(局部)内部类访问某个局部变量,为什么这个局部变量一定需要用final 关键字修饰? 首先,什么是局部变量?这里的局部是:在方法里面定义的变量. 因此,内部类能够访问某局部 ...

  6. Mac os下android studio模拟器无法联网解决方法

    步骤1: https://blog.csdn.net/qq_33945246/article/details/79908298 步骤2: 访达进入/Users/文件夹 步骤3: shift+cmman ...

  7. SELECT版FTP

    功能: 1.使用SELECT或SELECTORS模块实现并发简单版FTP 2.允许多用户并发上传下载文件环境: python 3.5特性: select 实现并发效果运行: get 文件名 #从服务器 ...

  8. Request参数值自动去空格

    /// <summary> /// TypeTrimHelper /// </summary> public static class TypeTrimHelper { /// ...

  9. [算法专题] stack

    1. Convert Expression to Reverse Polish Notation http://www.lintcode.com/en/problem/convert-expressi ...

  10. KMP string pattern matching

    The function used here is from the leetcode. Details can be found in leetcode problem: Implement str ...