2013-07-23 38 views
0

有一個問題,有可能有一個時間戳列更新只是當一列更新(只有該列)?是否有可能在更新一列時更新時間戳列?

非常感謝!

+0

這將需要通過代碼來完成。 MySQL數據庫中的時間戳會在更新任何字段時更新 –

+0

簡答題是「否」......至少不是自動的。 –

+2

當然,它可以自動觸發! – jsedano

回答

5

您可以使用trigger

DELIMITER ;; 

CREATE TRIGGER foo BEFORE UPDATE ON my_table FOR EACH ROW 
    IF  NEW.colA <=> OLD.colA -- has not been updated 
    AND  NEW.colB <=> OLD.colB -- has not been updated 
    AND NOT NEW.colC <=> OLD.colC -- has been updated 
    -- etc. 
    THEN 
    SET NEW.colD = NOW(); -- update timestamp 
    END IF 
;; 

DELIMITER ; 

當心,你的TIMESTAMP列沒有啓用automatic updating

+0

嗨Eggyal,非常感謝您的回答!我遇到以下錯誤:「你的SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在第一行'DELIMITER'附近使用正確的語法:」我嘗試了不同的字符作爲限制器(#,/ /,/,|),我總是得到相同的錯誤:'( – Alejandra

+0

@Ajjandra:你在用什麼客戶端?「DELIMITER」是一個客戶端命令,它被mysql命令行工具識別,聽起來好像你的客戶端試圖將它發送到服務器,在那裏它是沒有意義的。你將不得不檢查你的客戶端的文檔來發現它的語句分隔符是如何調整的 – eggyal

+0

你是對的!我正在編寫一個遷移(rails)和「分隔符」單詞無法識別:)我只是在查詢之間放置了一個字符「^」,並放置了類似sql.split('^')的東西。 執行sq,除非sq.blank? 結束 – Alejandra

1

當然。您可以將時間戳列定義爲日期時間,然後在滿足條件時使用觸發器更新它。

粗糙的語法是:

CREATE TRIGGER trigger_name AFTER UPDATE ON table FOR EACH ROW 
BEGIN 
    IF(
    NOT NEW.watched_column <=> OLD.watched_column AND 
    NEW.other_a <=> NEW.other_a AND 
    ... 
    ) 
    THEN 
    SET NEW.timestamp_column = NOW(); 
    END IF; 
END 
+0

非常感謝您的快速回答:) – Alejandra