有同學說timestamp欄位的規則比較“詭異”。手冊裡面說的比較複雜,這裡簡單說明一下MySQL中 timestamp欄位的一些規則。
分為兩部分
定義規則:
1、 timestamp欄位有三個屬性:
a) 是否允許NULL。預設為not null。
b) 預設值 。可以設定為default CURRENT_TIMESTAMP 或default 某個常量。若定義時預設,對於第一個出現的timestamp欄位,預設為CURRENT_TIMESTAMP, 對於其他timestamp欄位,預設為 '0000-00-00 00:00:00'。 Default可以指定為null,前提是本欄位允許null。
比如聲明 field2 timestamp null default null。
c) On update CURRENT_TIMESTAMP。是否在更新其他欄位時自動將該timestamp欄位修改為目前時間戳。對於第一個出現的timestamp欄位,預設為On update CURRENT_TIMESTAMP, 對於其他timestamp欄位,沒有此行為。
2、 default CURRENT_TIMESTAMP 和 On update CURRENT_TIMESTAMP 可以同時修飾一個列。被這兩個屬性任意一個修飾的列定義為timestamps_with_niladic, 一個表中最多隻能存在一個定義為timestamps_with_niladic的列。若超過1個,則建表失敗。
以上是定義規則,用於定義建表行為。建表完成以後可以用show create table xxx 來驗證上述規則。有了表定義後,我們來看timestamp的使用規則。
使用規則
1、 在insert或update語句中設定timestamp欄位為null時
a) 若該列為not null,則設定為目前時間戳
b) 若該列為允許null, 則設定為null
2、在insert時若預設,(insert 語句不指定該列的值),則等效於賦預設值。具體值由default部分決定。
3、若一個列有 On update CURRENT_TIMESTAMP 屬性,修改本行其他列時會將此timestamp列的值修改為目前時間戳。
瞭解了上面的規則,再來分析你碰到的情況,看看是不是沒那麼”詭異“了