問(wèn)題描述
一個(gè)表中定義了兩個(gè)timestamp類型的字段涩馆,
create_time TIMESTAMP NOT NULL COMMENT '創(chuàng)建時(shí)間',
update_time TIMESTAMP NOT NULL COMMENT '更新時(shí)間'
新插入記錄時(shí),給create_time和update_time各自賦予當(dāng)前時(shí)間值豪嗽,沒(méi)出現(xiàn)問(wèn)題珠十。更新記錄時(shí)代碼中只更新update_time,結(jié)果create_time也被自動(dòng)更新成了當(dāng)前時(shí)間荠诬。
刨根問(wèn)底
在create table語(yǔ)句中琅翻,對(duì)第一個(gè)出現(xiàn)的timestamp類型字段的定義會(huì)有如下幾種情況:
1.使用DEFAULT CURRENT_TIMESTAMP,表示列值為當(dāng)前時(shí)間戳但不會(huì)自動(dòng)更新柑贞;
2.使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP方椎,表示列值為當(dāng)前時(shí)間戳并且自動(dòng)更新,也就是每次更新記錄都會(huì)自動(dòng)更新該列值為當(dāng)前時(shí)間戳钧嘶;
3.沒(méi)有使用DEFAULT CURRENT_TIMESTAMP或DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP棠众,它默認(rèn)使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
4.沒(méi)有使用DEFAULT CURRENT_TIMESTAMP,而使用了ON UPDATE CURRENT_TIMESTAMP闸拿,列值默認(rèn)為0并且自動(dòng)更新空盼;
而第二個(gè)出現(xiàn)的timestamp類型字段,如果沒(méi)有使用DEFAULT CURRENT_TIMESTAMP或DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP新荤,它默認(rèn)使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP揽趾。
對(duì)于使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP進(jìn)行定義的列,需要注意的是如果該字段值沒(méi)有發(fā)生變化苛骨,將不會(huì)進(jìn)行更新篱瞎,而且對(duì)于多個(gè)使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP進(jìn)行定義的列,mysql只會(huì)更新第一個(gè)使用它定義的列痒芝。