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」
相關文章
相關標籤/搜索