MySQL 第一列timestamp自動屬性

Timestamp潛在危險

集團多處提醒:第一列timestamp可能會被MySQL設置爲根據當前時間自動更新。

甚至集團都建議:建表的時候time_modified列設置在time_created列之前,我覺得這件事挺不可思議的。

究竟是什麼情況下,第一列timestamp會被增加ON UPDATE CURRENT_TIMESTAMP

MySQL官方文檔

你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。
在這裏插入圖片描述
原文地址: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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章