Mysql使用on update current_timestamp問題怎麼解決

WBOY
發布: 2023-06-02 12:07:34
轉載
2699 人瀏覽過

    Mysql使用on update current_timestamp注意點

    最近專案裡時間欄位(datetime,timestamp)用到了ON UPDATE CURRENT_TIMESTAMP屬性,自動更新列時間戳。以下記錄一些需注意的地方。

    先說結論

    如果你設定了時間隨當前時間戳更新( ON UPDATE CURRENT_TIMESTAMP),那麼當你更新欄位時,只有欄位值改變了,你的時間欄位才會變成UPDATE操作時的時間。

    也就是沒有欄位更新時,雖然執行了update語句,也執行成功了,時間欄位是不會更新的。

    例如我們新建一張表:

    CREATE TABLE `t_temp` (
      `id` int(11) NOT NULL DEFAULT '0',
      `username` varchar(255) DEFAULT NULL,
      `upd_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '默认取当前时间',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    登入後複製

    然後插入一行數據,然後執行更新。

    Mysql使用on update current_timestamp問題怎麼解決

    UPDATE t_temp SET username = 'mm' WHERE id = 1;
    登入後複製

    會發現時間列不會更新。

    同樣,在程式中使用了一些框架,例如tk-mybatis,使用更新方法時(例如int updateByPrimaryKeySelective(T record);方法),如果字段沒有實際更新,雖然語法執行了,時間字段也不會更新,這點在系統中容易忽略。

    CURRENT_TIMESTAMP()和ON UPDATE及索引相關

    基本機率

    CURRENT_TIMESTAMP()可以把MYSQL中TIMESTAMP類型設定為目前的時間。

    ON UPDATE個人覺得這個是神器,一般用於當某個欄位是updateTIme,最後修改時間的時候,使用這個ON UPDATE即可。這樣就不用開發者自己去處理了,MySQL能自動處理。

    最後來說下索引,這個是來自百度,具體是誰的,我也忘記了:索引是一種特殊的文件(InnoDB資料表上的索引是表空間的一個組成部分) ,它們包含著對資料表裡所有記錄的引用指標。

    可以這樣說,資料庫索引就像是一本書的目錄,它能提高資料庫查詢的速度。索引分為叢集索引和非叢集索引兩種,叢集索引是依照資料存放的實體位置為順序的,而非叢集索引就不一樣了;叢集索引能提高多行擷取的速度,而非聚集索引對於單行的檢索很快。

    如果建立過多的索引,會對更新和插入操作的速度產生影響,因為需要更新每個索引檔案。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

    程式碼與實例

    如下建表程式碼:

    CREATE TABLE timeDemo(
     
    	id VARCHAR(64) NOT NULL,
    	timeTest TIMESTAMP NOT NULL,
    	PRIMARY KEY (id)
    );
    登入後複製

    當新增一個新資料的時候:

    Mysql使用on update current_timestamp問題怎麼解決

    ##他會自動建立時間,例如某個訂單表,他要記錄下訂單的時間,就可以用這種方法來處理。

    包含updateTime,最後更新時間:

    CREATE TABLE timeDemo2(
     
    	id VARCHAR(64) NOT NULL,
    	createTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
    	updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
    	PRIMARY KEY (id)
     
    );
    登入後複製

    //上面這個mysql5.7以上版本不會有問題,但5.7以下版本會有問題

    // 5.7以下的版本建議使用程式去插入。

    這裡用5.5示範下ON UPDATE的效果

    CREATE TABLE timeDemo3(
     
    	id VARCHAR(64) NOT NULL,
    	updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
    	PRIMARY KEY (id)
    );
    登入後複製

    當修改了這個表的某些資料後,updateTime這個數值會自動更新。

    Mysql使用on update current_timestamp問題怎麼解決

    每次對這條記錄進行更新,updateTime就會自動更新,這樣的話,就不用程式設計師自己去處理了。

    這裡可以發現,難過很多網路公司都喜歡用MySQL5.7以上的版本,而傳統產業還是在用MySQL5.5版本。

    說下索引key和index

    CREATE TABLE timeDemo4(
     
    	id VARCHAR(64) NOT NULL,
    	id2 VARCHAR(64) NOT NULL,
    	updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
    	PRIMARY KEY (id),
    	KEY(id2)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    登入後複製
    普通索引的唯一目的是提高資料存取的速度,這種索引由關鍵字KEY或INDEX定義。因此,應該只為那些最常出現在查詢條件(WHERE column = ...)或排序條件(ORDER BY column)中的資料列建立索引。

    為了建立索引,應選擇一個最規整、最緊湊的資料列,如一個整數類型的資料列,只要有可能。 

    以上是Mysql使用on update current_timestamp問題怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板