不做死就不会死mysql
在定义建立时间和 更新时间的时候;sql
定义了2个 timestamp 类型,而且给他来个默认值:CURRENT_TIMESTAMP数据库
而后保存:居然不能够思议的报错了。。。这是为何呢?服务器
纠结了一下 果断去探讨下timestamp 发现:测试
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 默认值
换句话说你的建立语句是:code
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会帮你转换成:server
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;
插入数据:ci
INSERT INTO `test2` () VALUES ()
得出结果:it
select * from test2; id create update 0 2017-10-10 16:23:05 0000-00-00 00:00:00
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
一个表中,有两个字段,createtime和updatetime。io
这样的需求mysql5.6前的版本显然是作不到的。由于你没法避免在两个字段上设置CURRENT_TIMESTAMP
那活仍是得作呀!下面提供几种方法:
当insert和update的时候触发器触发时间设置。 这个方法确定是可行的,这是其中一种解决问题的手段,可是我我的感受视乎代价有点大了。。。
这样作的好处也有一个:current_timestamp是mysql特有的,当数据库从mysql转移到其余数据库的时候,业务逻辑代码是不用修改的。
方法不少。。。可能还有我没想到的。。。