MySQL案例-TIMESTAMP NOT NULL与NULL

本文介绍了在 MySQL 5.7.17 及以上版本中,尝试向 timestamp 类型字段插入 NULL 值时遇到的问题及解决方案。通过调整 explicit_defaults_for_timestamp 参数,可以允许使用 NULL 作为 timestamp 列的值,MySQL 会自动使用当前时间进行替换。
-------------------------------------------------------------------------------------------------短文---------------------------------------------------------------------------------------------------------------
场景:
MySQL >= 5.7.17, 业务反馈数据库版本升级到5.7以后, 以前的一些sql在新版本无法执行了;

结论:
版本变迁导致一些不规范的写法被MySQL阻止了;

分析:
在测试环境重现一下;
新版本报错的语句:

点击(此处)折叠或打开

  1. insert into timestamp_test values(0,null);

相关表的表结构:

点击(此处)折叠或打开

  1. CREATE TABLE `timestamp_test` (
  2.   `id` int(11) NOT NULL,
  3.   `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  4.   PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

报错信息如下:


当然, 从表面上看, 这种做法肯定不行, 都已经声明了time是not null的, 但是程序说老版本没问题, 而这种做法又是必需的, so......_(:з」∠)_......let' go!

既然是timestamp的问题, 那就找找有关timestamp的data type相关的信息吧;

翻一翻文档, 发现有这么一章: Automatic Initialization and Updating for TIMESTAMP and DATETIME

仔细找了找, 发现有提到这个问题:

 
大致意思: 
如果explicit_defaults_for_timestamp这个选项处于关闭状态, 那么当timestamp(注意, 不是datetime)的列在更新时, 可以用null来作为SQL中的value,
MySQL会自动使用当前时间来进行替换;

貌似改个参数就能解决了?  (⊙_⊙)


试试先.....


额.....这应该是最近最好解决的问题了.....至于sql_mode, strict_mode什么的对种行为毫无影响;

PS: 这个参数是和DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP一起使用的, 单独使用应该是没什么效果;


PPPPPPS: 其实这个小问题没必要写个blog, 扔在"千奇百怪的MySQL"下的 "MySQL之奇奇怪怪的小问题"就好了, 不过嘛...居然还有这种操作....这是我看到这种做法的第一反应....(╯>д<)╯ 那就记下来吧.....

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29510932/viewspace-2144361/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29510932/viewspace-2144361/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值