资讯专栏INFORMATION COLUMN

mysql版本体验记录之timestamp

wayneli / 3113人阅读

摘要:版本体验记录之说默认值只有一个不作死就不会死在定义创建时间和更新时间的时候定义了个类型,并且给他来个默认值然后保存竟然不可以思议的报错了。。。可以去掉隐性默认值需求分析一个表中,有两个字段,和。

mysql版本体验记录之timestamp 1.timestamp 说默认值只有一个

不作死就不会死

在定义创建时间和 更新时间的时候;

定义了2个 timestamp 类型,并且给他来个默认值:CURRENT_TIMESTAMP

然后保存:竟然不可以思议的报错了。。。这是为什么呢?

纠结了一下 果断去探讨下timestamp 发现:

2.问题分析: 2.1 mysql5.5版本下:
1.第一个未设置默认值的TIMESTAMP NOT NULL字段隐式默认值: 

    CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
2.后面未设置默认值的TIMESTAMP NOT NULL字段隐式默认值: 

    0000-00-00 00:00:00

3.TIMESTAMP NOT NULL字段插入NULL时,会使用隐式默认值:
    
    CURRENT_TIMESTAMP

4.不支持多个CURRENT_TIMESTAMP 默认值

换句话说你的创建语句是:

CREATE TABLE `test` (
`id`  int(11) NOT NULL ,
`create`  timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
`update`  timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP ,
PRIMARY KEY (`id`)
)
;

但是mysql5.5会帮你转换成:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `update` timestamp NOT NULL DEFAULT "0000-00-00 00:00:00",
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

插入数据:

INSERT INTO `test2` () VALUES ()

得出结果:

select * from test2;

id  create              update
0    2017-10-10 16:23:05    0000-00-00 00:00:00
2.2 mysql5.6版本下:
1.支持多个CURRENT_TIMESTAMP 默认值;


2.可以兼容5.5的行为,支持隐性默认值 

        explicit_defaults_for_timestamp=0
        我测试安装的MySQL5.6默认使用这个参数,启动时,服务器会给出一个警告。 
        [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).
        
3.可以去掉隐性默认值 
    explicit_defaults_for_timestamp=1
    
    
3.需求分析:

一个表中,有两个字段,createtime和updatetime。

当insert的时候,sql两个字段都不设置,会设置为当前的时间

当update的时候,sql中两个字段都不设置,updatetime会变更为当前的时间

这样的需求mysql5.6前的版本显然是做不到的。因为你无法避免在两个字段上设置CURRENT_TIMESTAMP

那活还是得做呀!下面提供几种方法:

3.1 使用触发器
当insert和update的时候触发器触发时间设置。

这个方法肯定是可行的,这是其中一种解决问题的手段,但是我个人感觉视乎代价有点大了。。。
3.2 在sql语句中使用时间戳。

这样做的好处也有一个:current_timestamp是mysql特有的,当数据库从mysql转移到其他数据库的时候,业务逻辑代码是不用修改的。

方法很多。。。可能还有我没想到的。。。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/47274.html

相关文章

  • MySQL学习笔记数据类型

    摘要:整数类型有两种类型的数字整数和实数。类型用于存储可变长字符串,是最常见的字符串数据类型。和家族之间仅有的不同是类型存储的是二进制数据,没有排序规则或字符集,而类型有字符集和排序规则。 整数类型 有两种类型的数字:整数和实数。如果存储整数,可以使用这几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8,16,24,32,64位存储空间。它们...

    sunnyxd 评论0 收藏0
  • 手撕面试官系列(十):面试必备常问Dubbo29题+MySQL55题

    摘要:专题面试题答案领取见个人主页支持哪些协议,每种协议的应用场景,优缺点超时时间怎样设置有些哪些注册中心集群的负载均衡有哪些策略是什么的主要应用场景的核心功能的核心组件服务注册与发现的流程的架构设计的服务调用流程支持哪些协议,每种协议的应用场景 Dubbo专题showImg(https://segmentfault.com/img/remote/1460000019847596);(面试题...

    Tonny 评论0 收藏0
  • ubuntu mysql 5.7 replica同步

    摘要:且根据不同的引擎类型与数据库集群配置方式,都有很多具体的复制方式和参数配置就我个人看,前期根据尽量考虑周全,以避免不必要的后期更新与容错。更多建议参考官方文档,或者高性能中复制章节。官方文档参考非官方文档参考 主备目的 高可用 可扩展 容灾 备份 数据仓库 基本流程(图) 主库把数据更改记录到二进制文件(binary log) 备库将主库的日志复制到自己的中继日志(relay log...

    William_Sang 评论0 收藏0
  • 初探 MySQL 的 Binlog

    摘要:启用的过程就是修改配置文件了。每个事件都由一个事件头和事件体组成。接下去的一堆事件将会按照第一个事件描述符所描述的结构版本进行解读。还有那个,在版本中代表从一开始到下一个事件开始的偏移量,比如到第一个事件的就是,因为文件头有一个字节的长度。 原文地址:https://xcoder.in/2015/08/10/mysql-binlog-try/   花瓣网的搜索架构需要重构,尤...

    Ali_ 评论0 收藏0
  • MySQL】explicit_defaults_for_timestamp 参数详解

    摘要:本文主要介绍该参数打开和关闭情况下对的影响。在不同环境间,此参数建议统一,不然可能出现程序在这个环境运行正常在另外一个环境却出现报错的情况。笔者了解到亚马逊实例该参数默认为,在环境迁移时要特别注意下该参数。 简介: explicit_defaults_for_timestamp 系统变量决定MySQL服务端对timestamp列中的默认值和NULL值的不同处理方法。此变量自MySQL ...

    W4n9Hu1 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<