MySQL 第一列timestamp自動屬性
Timestamp潛在危險
集團多處提醒:第一列timestamp可能會被MySQL設置爲根據當前時間自動更新。
甚至集團都建議:建表的時候time_modified列設置在time_created列之前,我覺得這件事挺不可思議的。
究竟是什麼情況下,第一列timestamp會被增加ON UPDATE CURRENT_TIMESTAMP
?
MySQL官方文檔
原文地址:https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
explicit_defaults_for_timestamp
一個很重要的系統變量:explicit_defaults_for_timestamp
查詢了一下公司目前MySQL該系統變量的值爲OFF
白話文
上面的中文是谷歌自動翻譯,可能不是很準確,我這邊會總結一下,幾個關鍵的問題。
在explicit_defaults_for_timestamp:OFF
的情況下,第一列timestamp會同時設置DEFAULT CURRENT_TIMESTAMP
and ON UPDATE CURRENT_TIMESTAMP
,如果兩者都沒有明確指定爲第一列timestamp。
其實以上這句話已經總結好了,爲了解釋這句話,下面繼續補充了。
- 情況一:
explicit_defaults_for_timestamp:ON
,由於公司系統變量是OFF,不計劃變更系統變量參數,此種情況不分析。 - 情況二:
explicit_defaults_for_timestamp:OFF
- 使用DEFAULT指定
- 將列設置爲可以爲NULL,這樣會引發一個問題,列可以爲NULL的問題。
這是官網的列子。
- 以上三種表結構,第一列timestamp都沒有自動初始化或更新。
- t1表NOT NULL,t2、t3 NULL
- t2表定義ts1字段允許NULL,所以默認值也是NULL,只是沒有顯示的定義DEFAULT NULL。
t3表字段允許爲NULL,默認值顯示定義爲0。
看到這裏我相信你們應該都明白這是怎麼回事了。
總結
爲了避免第一列timestamp自動更新的情況。
如果第一列timestamp是業務的時間戳,例如:計劃開始時間,又不需要默認值,將列設置爲可以爲NULL。
如果第一列timestamp是創建時間字段,例如:time_created,可以指定爲DEFAULT CURRENT_TIMESTAMP。