2013-07-24 45 views
8

我希望epc列始終爲earnings/clicks。我正在使用AFTER UPDATE觸發器來完成此操作。因此,如果我要爲此表添加100次點擊,我會希望EPC自動更新。更新觸發器UPDATE後的同一行

我想這一點:

CREATE TRIGGER `records_integrity` AFTER UPDATE ON `records` FOR EACH ROW SET 
NEW.epc=IFNULL(earnings/clicks,0); 

而且收到此錯誤:

MySQL said: #1362 - Updating of NEW row is not allowed in after trigger 

我試着使用舊的很好,但也得到了一個錯誤。我可以做BEFORE,但如果我添加了100次點擊,它會使用以前的#次觸發(對吧?)

我應該怎麼做才能做到這一點?

編輯 - 這將在此運行的查詢的一個例子:

UPDATE records SET clicks=clicks+100 
//EPC should update automatically 

回答

10

你不能在更新觸發更新表中的行。

也許你想是這樣的:

CREATE TRIGGER `records_integrity` BEFORE UPDATE 
ON `records` 
FOR EACH ROW 
    SET NEW.epc=IFNULL(new.earnings/new.clicks, 0); 

編輯:

內觸發,你必須可以訪問OLDNEWOLD是記錄中的舊值,NEW是新值。在觸發器之前的中,NEW值是寫入表中的值,因此您可以修改它們。在觸發器之後的中,NEW值已被寫入,因此它們不能被修改。我認爲MySQL documentation解釋得很好。

+0

是不是你的後續更新? – hellohellosharp

+0

@hellohellosharp。 。 。不知何故,當我查看代碼時並非如此。 ;) –

+0

感謝您的更新 - 您的答案似乎工作。我很困惑,雖然...以前的更新不會使用錯誤的值來獲取點擊次數和收入? – hellohellosharp

0

也許你可以寫兩個單獨的語句在交易

update record set clicks=... 

update record set epc=... 

,或者你可以把它們放在一個函數裏,說updateClick(),只是調用該函數。通過這樣做,您可以根據需要輕鬆改變您的邏輯。

將邏輯放入觸發器中可能會造成調試和跟蹤變得不必要的複雜情況。