mysql数据库时间字段CURRENT_TIME问题

1、背景

进入产品迭代阶段,修改数据库字段是不免的。除了咱们可以想到的,新增字段,必定要设置为“容许为空”或者设置“默认值”,当涉及到mysql的时间字段时,也要格外当心。java

下面是报错:mysql

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp Query

2、分析问题

  1. 这是一个数据库表的create_time字段,出现值:'0000-00-00 00:00:00'。
  2. 查看了数据库,最新记录create_time字段时间都是正确的,某个时间以前的记录create_time字段时间都是'0000-00-00 00:00:00'。
  3. 先更新错误的历史记录字段值。
  4. 这个问题以前也碰到过,看来这个坑很容易出现了。

3、 重现问题

  1. 新建一个表
CREATE TABLE `a` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  1. 插入两条数据
INSERT INTO a(id, name) VALUES(1, "张三");
INSERT INTO a(id, name) VALUES(2, "李四");

插入两条数据图片

  1. 新建两个字段
ALTER Table a ADD COLUMN create_time timestamp not null DEFAULT CURRENT_TIMESTAMP;
ALTER Table a ADD COLUMN update_time timestamp not null ON UPDATE CURRENT_TIMESTAMP;

两个字段值对比图

  1. 而后插入一条记录
INSERT INTO a(id, name) VALUES(3, "王五");

插入一条记录结果图

  1. 而后更新一条记录
UPDATE a SET name="马六" WHERE id = 3;

更新一条记录结果图

4、结论

  1. "DEFAULT CURRENT_TIMESTAMP":在“建立时”,将字段值初始化为当前时间; "ON UPDATE CURRENT_TIMESTAMP":在“更新时”,将字段更新为当前时间,而在“建立时”,由于NOT NULL,因此设为了“0000-00-00 00:00:00”,有些版本mysql是不容许存在超过一个的timestamp类型字段,datetime类型呢,则不容许“0000-00-00 00:00:00”这样的默认值。
  2. 通常来讲,create_time字段设置为 “DEFAULT CURRENT_TIMESTAMP”,update_time字段能够设置为“on update CURRENT_TIMESTAMP”
相关文章
相关标签/搜索