1. 程式人生 > >關於在SQL語句中記錄新增時間和修改時間的簡單用法:invalid default value for create_time

關於在SQL語句中記錄新增時間和修改時間的簡單用法:invalid default value for create_time

最近看到別人的專案中,資料庫中加入了建立時間和修改時間,感覺這個挺實用,就想建立一個demo試試怎麼用,查詢之後發現修改時間使用的是timestamp欄位格式,資料庫會根據當前時間,自動處理,不需要在SQL語句中設定,建立時間為datetime,預設值是CURRENT_TIMESTAMP,使用時直接在SQL語句中使用now()來獲取當前的時間,但是動手之後,問題就來了!!!!

首先是在建立資料庫欄位的時候就報錯了,使用的是MySQL,工具用的Navicat,但是,設定create_time欄位為datetime,預設值為CURRENT_TIMESTAMP儲存時就提示invalid default value for create_time

的錯誤,反覆查詢之後,無果。。。。。。。。。。。
我按照別人的部落格裡面的截圖直接在Navicat裡面手動設定相同的欄位和預設型別,還是報這個錯誤。。。。。。。wtf??????

這是別人設定的:
這裡寫圖片描述

這是我的設定:
這裡寫圖片描述
這裡寫圖片描述
儲存就提示:
這裡寫圖片描述
折騰了半天,查到說是MySQL 5.6以後timestamp設定預設值規則改變,不能為”0000 00-00 00:00:00”,但是現在我並沒有插入值,只是建立資料庫欄位,這裡就通過不了了 還談什麼後期插入新的資料呢。。。。。。。。

在查了將近一個小時的時間裡 很多部落格都說修改一下資料庫預設設定的時間不能為零,我感覺這個根本無關痛癢,我也沒有嘗試。。。。。。

最後偶然在一個部落格下面看到一句總結:

timestamp型別適合用來記錄資料的最後修改時間,因為只要你更改了記錄中其他欄位的值,timestamp欄位的值都會被自動更新。(如果需要可以設定timestamp不自動更新)

然後想出來一個笨方法:

設定的欄位如下圖所示:

這裡寫圖片描述
因為建立時間是固定的,修改的時間是跟隨系統更新的,所以將create_time欄位型別設定為varchar,建立新資料時,為這個欄位賦值,直接使用now(),取值,插入到create_time 裡面即可。將update_time 設定為timestamp,並勾選根據當前時間戳更新,
既然now(),可以獲取到當前時間,那麼可以嘗試將create_time 型別設定為字串,然後 在執行insert語句的時候,在新增的SQL語句中的欄位裡面加上create_time,value為now(), 這樣就可以在資料庫中插入新增的時間了

比如現在往資料庫新增一條新的資料:insert into user ( username, password, create_time ) VALUES ('小明22', '12345', now())
這裡寫圖片描述

這裡create_time和update_time都是當前時間,但是不同的是 create_time的時間是使用now()獲取到的當前系統時間,然後使用SQL語句,賦值給create_time的,而update_time 是系統自動賦值的,不需要在SQL語句中具體操作的。

執行修改的操作後,update_time 會自動更新為修改的時間

執行語句update user set username = '小明32' where id = 32之後,create_time 仍然為建立時的時間,而update_time自動更新為新的時間
這裡寫圖片描述

總結:由於建立的時間是固定的,可以設定create_time欄位的屬性為varchar,在建立時,在SQL語句中使用now(),來為create_time欄位賦值。
updae_time的屬性設定為timestamp,並勾選根據時間戳更新,這樣在執行update語句時,會自動更新修改的時間。

小白一個,各位如果有更好地方法,歡迎指教。