有一個相當簡單的方法來處理這個問題。讓我們將其視爲管理行的時間戳更新時的管理。
首先,我相信你知道,你的表格需要一個時間戳列,其默認設置爲INSERT
和UPDATE
。如果該列名爲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查詢。但對於這個問題,其他方法也是如此。