2011-10-06 48 views
0

我遇到了一個問題,我希望某個字段以類似於時間戳類型字段的方式工作,只有在更新時纔會更新其中的更新記錄。只有當行中的其他信息發生變化時才更新MySQL字段

我正在使用php來更新myisam表的mysql數據庫。

取其中有一個行具有以下字段下面的示例表; -

UNIQUEID : 1 
TITLE : Example 
AMENDAT : (timestamp) 
AMENDBY : Andy 

我有一些代碼,處理在桌子上的維護。更新表的用途(例如)下面的語句; -

update example set TITLE="New Title",AMENDBY="Andy" where UNIQUEID=1 ; 

此語句工作正常,並更新該行包括AMENDAT時間戳字段。

如果不同用戶進行相同的變化; -

update example set TITLE="New Title",AMENDBY="Bob" where UNIQUEID=1 ; 

再次,一切正常。

但是,如果語句中的任何列沒有更改(可能在現實世界中,因爲表中有大量字段,可能會調用更新語句全部更新一次,我不希望在之前和字段的值後的代碼進行檢查 - 我只是讓更新採取的應變); -

update example set TITLE="Example",AMENDBY="Andy" where UNIQUEID=1 ; 

在這種情況下,MySQL決定什麼需要完成,所以它不會更新AMENDAT時間戳(到目前爲止都是很好的)。

但是,如果另一個用戶做同樣的事情; -

update example set TITLE="Example",AMENDBY="Bob" where UNIQUEID=1 ; 

然後該行被更新,由於AMENDBY領域的變化。所以即使實際數據沒有改變,修改的細節也會有(這對我的修正跟蹤不利)。

我目前的工作圍繞這個問題是使用更新下面的語句; -

update example set TITLE="XYZ",AMENDBY="XYZ",AMENDAT=NULL where UNIQUEID=123 ; 

這每一次強制更新,因此該修正案的細節將反映在最後一個用戶保存記錄是否他們沒有做任何改變。顯然這並不理想。

只有當記錄上的其他字段發生更改時,是否有任何方法使AMENDBY字段更新,就像時間戳類型字段的默認功能一樣?

我意識到這個問題很容易解決,通過對MySQL進行兩個獨立的調用,一個做更新和檢查從返回(記錄數量更新)是否進行第二次調用來更新修正細節,但這是一個混亂而不是非常優雅的解決方案。

請記住,我有大量的表以相同的方式設置,每個表都有一個任意數量的字段,所以我不想要一個解決方案,它需要對MySQL的巨大呼叫,其中包括如果陳述每個字段可能或不可能更新。

回答

0

我認爲你正在嘗試做的事情可以通過在UPDATE事件之後的定時AFTER後用TRIGGER來實現。觸發器可能會非常棘手,請謹慎使用它們。還要記住,如果由於某種原因觸發語句失敗,實際的UPDATE/INSERT/DELETE也會失敗。

相關問題