MySQL中CURRENT_TIMESTAMP時間戳的使用詳解
前言
最近在項(xiàng)目中發(fā)現(xiàn)一個小問題,數(shù)據(jù)被更改時,插入記錄和更新記錄的時間會被同步更新。設(shè)置的兩個時間create_time、update_time,按照預(yù)期來講,應(yīng)該是創(chuàng)建記錄的時候會同步更新create_time,update_time,而在更新記錄的時候,只有update_time會被同步更新。但實(shí)際情況卻是update記錄時,兩個time都會被同步更新。
在代碼中并沒有對時間進(jìn)行顯性的設(shè)置,對時間的維護(hù)是MySQL本身進(jìn)行管理的,所以就查看了一下之前同事創(chuàng)建表時的SQL。
通過SQL語句可以看出,create_time 和 update_time 設(shè)置的都是 DEFAULT CURRENT_TIMESTAMP,不管是新創(chuàng)建的記錄,還是更新原有的記錄,只要是有觸發(fā)的操作,這兩個時間就會被同步修改。所以要達(dá)到預(yù)期的效果,就需要修改這里了。問題根源就是SQL語句這里的設(shè)置。
解決:
把update_time的 DEFAULT CURRENT_TIMESTAMP后面再加上條件限制 ON UPDATE CURRENT_TIMESTAMP。這樣在更新記錄時,只有更新時間被修改,創(chuàng)建時間就是最初創(chuàng)建記錄的時間。
MySQL中的CURRENT_TIMESTAMP:
在創(chuàng)建時間字段的時候-----
① DEFAULT CURRENT_TIMESTAMP
表示當(dāng)插入數(shù)據(jù)的時候,該字段默認(rèn)值為當(dāng)前時間
② ON UPDATE CURRENT_TIMESTAMP
表示每次更新這條數(shù)據(jù)的時候,該字段都會更新成當(dāng)前時間
這兩個操作是mysql數(shù)據(jù)庫本身在維護(hù),所以可以根據(jù)這個特性來生成【創(chuàng)建時間】和【更新時間】兩個字段,且不需要代碼來維護(hù)。
如下:
CREATE TABLE `mytest` ( `id` bigint NOT NULL AUTO_INCREMENT, `comments` varchar(255) DEFAULT '' COMMENT '內(nèi)容', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時間', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; //如果想設(shè)置一個具體的默認(rèn)時間可以這樣: CREATE TABLE `mytest2` ( `id` bigint NOT NULL AUTO_INCREMENT, `comments` varchar(255) DEFAULT '' COMMENT '內(nèi)容', `create_time` timestamp DEFAULT '2020-12-12 12:12:12' COMMENT '創(chuàng)建時間', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
補(bǔ)充:mysql自帶的一些函數(shù)功能也是很強(qiáng)大的,這里整理了一下時間方面的
獲取當(dāng)前時間格式串:
#獲取當(dāng)前時間戳 current_timestamp() yyyy-mm-dd hh:ii:ss now() yyyy-mm-dd hh:ii:ss curdate() yyyy-mm-dd current_date() curtime() hh:ii:ss current_time()
提取date各個字段
#提取date各個字段 date('yyyy-mm-dd hh:ii:ss') yyyy-mm-dd year('yyyy-mm-dd hh:ii:ss') yyyy month('yyyy-mm-dd hh:ii:ss') mm day('yyyy-mm-dd hh:ii:ss') dd
提取time各個字段
#提取time各個字段 time('yyyy-mm-dd hh:ii:ss') hh:ii:ss hour('yyyy-mm-dd hh:ii:ss') hh minute('yyyy-mm-dd hh:ii:ss') ii second('yyyy-mm-dd hh:ii:ss') ss
獲取當(dāng)前或者某一時間的unix時間戳
#unix時間戳1970-01-01以來的秒數(shù) unix_timestamp() #同時還可以將某一時間格式串的秒數(shù)轉(zhuǎn)化出來 unix_timestamp('yyyy-mm-dd hh:ii:ss')
格式化時間串和格式化時間戳
#格式化時間串 date_format 與 time_format 為同一函數(shù) 輸入為 date_format(now(), '%Y-%m-%d %T'); time_format(now(), '%H:%i:%s'); #格式化時間戳 將時間戳轉(zhuǎn)化為時間格式串 from_unixtime(unix_timestamp(), "%Y-%m-%d %T")
總結(jié)
到此這篇關(guān)于MySQL中CURRENT_TIMESTAMP時間戳使用的文章就介紹到這了,更多相關(guān)MySQL CURRENT_TIMESTAMP時間戳內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql用戶創(chuàng)建與授權(quán)的簡單實(shí)例
MySQL等主流數(shù)據(jù)庫的最高權(quán)限一般是root用戶,有時我們需要提供數(shù)據(jù)庫的賬號和密碼以使用某些服務(wù),下面這篇文章主要給大家介紹了關(guān)于mysql用戶創(chuàng)建與授權(quán)的相關(guān)資料,需要的朋友可以參考下2022-03-03在Ubuntu或Debian系統(tǒng)的服務(wù)器上卸載MySQL的方法
這篇文章主要介紹了在Ubuntu或Debian系統(tǒng)的服務(wù)器上卸載MySQL的方法,適用于Debian系的Linux系統(tǒng),需要的朋友可以參考下2015-06-06MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語言
這篇文章主要介紹了MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語言,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08MYSQL數(shù)據(jù)庫查詢按日期分組統(tǒng)計(jì)詳細(xì)代碼
這篇文章主要給大家介紹了關(guān)于MYSQL數(shù)據(jù)庫查詢按日期分組統(tǒng)計(jì)的相關(guān)資料,按日期分組是指按照時間維度對數(shù)據(jù)進(jìn)行分類匯總統(tǒng)計(jì),常用于查詢分析具有時間屬性的數(shù)據(jù),例如訂單量、用戶活躍等,需要的朋友可以參考下2024-01-01