2013-01-20 86 views
1

我有一個大表DATETIME列和索引的原因,我想添加一個只包含DATE類型的列。看起來MySQL不能使用下面的表達式來使用索引GROUP BY DATE(datetime)因此我想添加另一個列和第二個索引。MySQL更新DATETIME到DATE

要更新我用這個簡單的聲明:

UPDATE table SET datecol = DATE(datetimecol) 

現在出現一個奇怪的現象:在datecol-column包含正確的價值觀。但datetimecolumn也發生了變化:到目前的timestamp。這是此列的默認值。

我現在工作了很多年,數據庫和MySQL,但我無法解釋這種行爲。

當前版本爲MySQL 5.1.66-0

你有什麼建議或解釋嗎?

回答

1

datetimecol不是DATETIME型的,但TIMESTAMP類型的信息(默認)具有ON UPDATE CURRENT_TIMESTAMP的屬性,automatically updates到當前時間的記錄被修改。

要爲第一TIMESTAMP柱抑制自動屬性,執行以下操作之一:

  • DEFAULT子句指定的恆定默認值定義的列。

  • 指定NULL屬性。這也會導致列允許NULL值,這意味着您無法通過將列設置爲NULL來分配當前時間戳。分配NULL將列設置爲NULL

因此:

ALTER TABLE my_table 
    MODIFY datetimecol TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 

要更新記錄,這一次在不改變值datetimecol,你應該明確地將它們設置爲他們的現任值:

UPDATE my_table SET 
    datetimecol = datetimecol, 
    datecol  = DATE(datetimecol); 
+0

是,但我不想編輯這個專欄... – sisu

+0

嗯,這個作品!非常感謝:) 但爲什麼MySQL試圖更新這個列呢?對我來說,這並不是我自己的說法。 – sisu

+0

@fire:這在我上面的回答的第一段中沒有解釋(特別是它鏈接到的手冊頁)? – eggyal