2010-09-27 46 views
61

我需要更新2個日期時間列,我需要它們完全相同,使用mysql版本4.1.20。我使用這個查詢:mysql現在更新多列()

mysql> update table set last_update=now(), last_monitor=now() where id=1; 

它是安全還是有機會的列是具有不同時間更新,因爲now() 2個可見通話?
我不認爲它可以更新不同的值(我認爲內部mysql調用now()只是每行一次或類似的東西),但我不是專家,你覺得呢?

第二個問題,爲什麼這個查詢不更新的列:如果你真的需要,以確保now()具有相同的值,你可以運行兩個查詢(會回答你的第二個問題太

mysql> update table set last_update=last_monitor=now() where id=1; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 
+0

我建議你從這裏刪除你的第二個問題,並最終在一個單獨的帖子重新發布。 – 2017-12-16 15:06:27

回答

103

找到了解決辦法:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1; 

我發現this在MySQL的文檔和一些測試後,它的工作原理:

以下語句將COL2當前(已更新)COL1值,而不是原始col1值。結果是col1和col2 具有相同的值。此行爲不同於標準SQL。

UPDATE t1 SET col1 = col1 + 1,col2 = col1;

關於第二個問題,沒有任何答案,沒有發現任何關於這個的mysql文檔。

1

在這種情況下,你問到update last_monitor = to last_updatelast_update尚未更新)

,你可以這樣做:

mysql> update table set last_update=now() where id=1; 
mysql> update table set last_monitor = last_update where id=1; 

無論如何,我認爲mysql足夠聰明,每個查詢只需要now()一次。

+0

這兩個更新如何?你是否也猜測mysql足夠聰明,可以將它們組合成一個語句?因爲它不會。 – Dementic 2014-03-27 14:20:12

1

在運行更新查詢之前,您可以將now()的值存儲在變量中,然後使用該變量更新字段last_updatelast_monitor

這將確保now()僅執行一次,並且在您需要的兩列上都更新相同的值。

1

您可以將以下代碼放在timestamp列的默認值中: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,所以更新時兩列取相同的值。

+1

AFAIK「on update」每個表格有一列限制,因此無法將它設置爲兩列。 – 2012-01-25 13:29:46

4

Mysql不是很聰明。當你想在多個更新或插入查詢中使用相同的時間戳時,你需要聲明一個變量。

當您使用now()函數時,系統將在您每次在另一個查詢中調用它時調用當前時間戳。