mysql timestamp


 一般建表時候,創建時間用datetime,更新時間用timestamp。這是非常重要的。

【1】timestamp字段所在行更新時,timestamp字段會被更新成當前時間

(1.1)一個表中出現了兩個timestamp字段類型

我測試了一下,如果你的表中有兩個timestamp字段,只要你更新任何非timestamp字段的值,則第一個timestamp列會更新成當前時間,而第二人timestamp列的值不變。

如圖中我的操作,即使我沒有設置request_time屬性為ON UPDATE CURRENT_TIMESTAMP,也會自動更新,你就說坑不坑!!!

  

 

 

 (1.2)使用查找原因

show create table [表名]

查看了一下MySQL系統create創建默認語句,果然發現問題!!創建request_time時MySQL會默認自動給第一個timestamp字段加上DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。

想去掉“自動更新:ON UPDATE CURRENT_TIMESTAMP”

只寫DEFAULT CURRENT_TIMESTAMP,則會把mysql系統默認的“自動更新:ON UPDATE CURRENT_TIMESTAMP”去掉。

只寫NULL 則會把mysql系統默認的“DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP”全部去掉。

而第二個timestamp字段不會。(第二個不會是因為第二個寫了 null !)

  

 

 

(1.3)解決方法:實用例子(使用timestamp最佳方案)

① 創建 timestamp NULL DEFAULT NULL:

  

② 測試一下各種場景:

 

完美解決!!!!!!

 ———————————————————————

(1.4)總結:

總結測試 5.7

創建形式 實際形式

request1 TIMESTAMP NOT NULL default current_timestamp

`request1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
request2 TIMESTAMP null `request2` timestamp NULL DEFAULT NULL
request3 TIMESTAMP not null

`request3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

如果放在其他 timestamp列之前,或只有它自己一個timestamp,則會變成如下:

`request3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

request4 TIMESTAMP default 0 `request4` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'

(1)當 request3 TIMESTAMP not null 列在timestamp字段中不是第一個字段時時

  

 

 (2)當 request3 TIMESTAMP not null 字段是第一個timestamp 字段是

  

 

 

二、MySQL日期類型DATETIME和TIMESTAMP 相關問題詳解

MySQL的日期類型有三種:DATETIME、DATE和TIMESTAMP,除了DATE用來表示一個不帶時分秒的是日期,另外兩個都帶時分秒。TIMESTAMP還可以精確到毫秒。

其次還有個共性,就是他們的格式“不嚴格”,很自由,一般你認為對的格式都可以正確插入到數據庫中。

這里主要解決帶時分秒日期的一些常見問題。

(2.1)TIMESTAMP

1、TIMESTAMP列MySQL系統默認為NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

  默認值可以為“0000-00-00 00:00:00”(前提是mysql的sql_model是非嚴格模式),但默認不能為null(如果想為null,則需要:[字段名] timestamp NULL DEFAULT NULL,也可以只寫 [字段名] timestamp NULL(系統會給默認增加DEFAULT NULL,不信可以使用show create table [表名]查看))。
2、如果ON UPDATE CURRENT_TIMESTAMP時(注意是系統默認加上的)TIMESTAMP列不可以設置值,只能由數據庫自動去修改。(原文的這個說法不對,timestamp可以修改,只不過即使改完,也會被ON UPDATE CURRENT_TIMESTAMP覆蓋掉)

3、一個表可以存在多個TIMESTAMP列,但只有一個列會根據數據更新而改變為數據庫系統當前值。因此,一個表中有多個TIMESTAMP 列是沒有意義,實際上一個表只設定一個TIMESTAMP列。

4、TIMESTAMP列的默認值是CURRENT_TIMESTAMP常量值。當紀錄數據發生變化的時候,TIMESTAMP列會自動將其值設定為CURRENT_TIMESTAMP(坑在這:自動更新)。

5、TIMESTAMP列創建后的格式是:

  `a` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  這個語句含義,a字段的默認值是CURRENT_TIMESTAMP,當紀錄更新時候,自動將a字段的值設置為 CURRENT_TIMESTAMP。
6、另外,下面的定義從語法角度是對的,但是沒有意義,因為該字段的值不可更改,永遠只能為默認值。
`b` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
(原文的這個說法不對,timestamp可以修改,DEFAULT內容也可以是任意格式的timestamp,不用非必需為CURRENT_TIMESTAMP)

(2.2)DATETIME

1、DATETIME列可以設置為多個,默認可為null,可以手動設置其值。

2、DATETIME列不可設定默認值,這是很多人煞費苦心研究的成果,呵呵!(其實是可以的 8.0親測,5.7也可以)

3、DATETIME列可以變相的設定默認值,比如通過觸發器、或者在插入數據時候,將DATETIME字段值設置為now(),這樣可以做到了,尤其是后者,在程序開發中常常用到。

一般建表時候,創建時間用datetime,更新時間用timestamp。

CREATE TABLE user (
id bigint(20) NOT NULL AUTO_INCREMENT,
name varchar(20) CHARACTER SET gbk NOT NULL,
sex tinyint(1) DEFAULT1′,
state smallint(2) DEFAULT1′,
createtime datetime NOT NULL,
updatetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1

 

(2.3)日期最大值范圍的問題

日期最大范圍的問題不是絕對的,很多人制定一個說不能查過20XX年,這是扯蛋,根本沒這回事。日期的范圍等問題與MySQL的運行模式有關。

當然這個范圍很寬廣,足夠祖宗十八代用了,不用擔心這問題了。

相反,要注意的問題是,編程語言對日期范圍的限制,不同的語言,有不同的限制,這里不做討論了。

(2.4)日期格式轉換

1、字符串轉日期

select STR_TO_DATE(‘2010-03-03 16:41:16′, ‘%Y-%m-%d %H:%i:%s’)

2、日期轉字符串

select DATE_FORMAT(‘2010-03-03 16:41:16′, ‘%Y-%m-%d %H:%i:%s’)

(2.5)日期的中 年月日時分秒星期月份 等獲取方法

select TIMESTAMP(‘2010-03-03 16:41:16′);

select DATE(‘2010-03-03 16:41:16′);

select YEAR(‘2010-03-03 16:41:16′);

select MONTH(‘2010-03-03 16:41:16′);

select DAY(‘2010-03-03 16:41:16′);

select TIME(‘2010-03-03 16:41:16′);

select CURTIME();

select CURDATE();

select CURRENT_DATE;

select CURRENT_TIME;

select CURRENT_TIMESTAMP;

方式很多,這里簡單列舉一二。

(2.6)日期的算術運算

相關的函數很多很多,用法也很簡單,一看就會,建議查看MySQL參考手冊。

mysql> SELECT DATE_ADD(‘1999-01-01′, INTERVAL 1 DAY);

-> ‘1999-01-02′

mysql> SELECT DATE_ADD(‘1999-01-01′, INTERVAL 1 HOUR);

-> ‘1999-01-01 01:00:00′

mysql> SELECT DATE_ADD(‘1998-01-30′, INTERVAL 1 MONTH);

-> ‘1998-02-28′

(2.7)日期的大小比較

拿着日當數字,拿着字符串當日期,呵呵,很簡單的。

and update_time > ‘2010-03-02 16:48:41′
and update_time <= ‘2010-03-03 16:51:58′


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM