2015-02-07 35 views
1

我有一張表,我繼續更新,從我的代碼中的其他來源的值。我更新的值可能與行中已有的值相同或不同。在更新表格時跟蹤行中的實際更改

我需要某種算法可以通過mysql(db)或其他方式(代碼的一部分),以便我稍後可能能夠識別哪些行具有更改的值。

有一個日期修改列,我改變。但這不會是一個真正的指標,因爲它會一直更新。我想要一種方法來確定某些預定義的列是否已更改值,

一種解決方案是:我可以執行選擇查詢,然後比較和更新表中已更改的標誌。但是這看起來很複雜,不適合我,因爲我有一個有很多記錄的表格

另一種解決方案可能是將值的md5校驗和保存在列中,並在更新時比較先前的md5和當前的md5等等。

我想知道最佳解決方案。

回答

0

有一個相當簡單的方法來處理這個問題。讓我們將其視爲管理行的時間戳更新時的管理。

首先,我相信你知道,你的表格需要一個時間戳列,其默認設置爲INSERTUPDATE。如果該列名爲ts,看起來像這樣。

ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

其次,您可以使用像這樣的UPDATE查詢來更改行中的值。

UPDATE stock 
    SET val1 = 'newval1', 
     val2 = 'newval2', 
     changed_by = 'current_user_id' 
WHERE id = 'id_to_change' 
    AND NOT (val1 == 'newval1' AND val2 == 'newval2') 

AND NOT條款的WHERE將防止發生更新,除非'newval1''newval2'實際上將提供新的價值。這是因爲沒有行與更新中的WHERE子句匹配。

當更新被阻止發生時,您自動設置的ts列不會更改。 changed_by列也不會設置爲當前用戶的user_id。所以,你有最近真正改變的時間和用戶。

此外,MySQL的許多主機語言接口都有一個方法調用來確定最近的UPDATE操作影響了多少行。使用這種技術,當行未更新時,您將返回零行。這對您的用戶界面可能很方便。

此外,此技術使用單個查詢,所以如果多個用戶同時嘗試更新同一行,則這是安全的。沒有必要使用交易來保證這一點。

(請注意,跟蹤changed_by用戶是可選的,只會工作,如果你的應用程序可以提供當前用戶的實際ID。)

這是相當有效的,只要數據庫搜索WHERE id = 'id_to_change'工作迅速。

它確實需要重新處理您的應用程序的UPDATE查詢。但對於這個問題,其他方法也是如此。