2012-08-30 65 views
6

我有以下觸發:MySQL的觸發器不能更新表 - 收到錯誤1442

CREATE TRIGGER sum 
AFTER INSERT 
ON news 
FOR EACH ROW 
UPDATE news SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

它總結表的int_viewsext_views柱和由總瀏覽量將其劃分。

每當我嘗試一個新的行添加到消息,我得到以下錯誤:

ERROR 1442 (HY000) at line 3: Can't update table 'news' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

觸發看起來很簡單我。是否有觸發器無法運行的原因?

+1

沒有'where'條件? – jcho360

+0

@ jcho360,對不起,我沒有看到哪裏包括哪裏條件。插入後,我希望觸發器在每一行都執行。 – egidra

+1

如果這不起作用讓我知道嘗試與'WHERE news_id = NEW.news_id;'在末尾 – jcho360

回答

9

症狀是,您正在運行UPDATE(對於所有行)在INSERT觸發器內 - 都修改表,這是不允許的。

這就是說,如果我猜想你的觸發器的意圖是否正確,你不想更新所有的行,而只是新插入的行。你可以用

CREATE TRIGGER sum 
BEFORE INSERT 
ON news 
FOR EACH ROW 
SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

心靈實現,很容易,這是一個BEFORE INSERT觸發,只要你想之前它被寫入表來更改行。

+0

同樣的問題對我來說,只需要刪除UPDATE tlb部分 - 謝謝! – Smith

6

如果您嘗試更新/插入上導致觸發火災不要使用常見sql命令狀

-> UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION_LIST; 
-> INSERT INTO TABLE_NAME VALUES("VALUE1","VALUE2"); 

這是行不通的同桌。只能使用set來分配您更新的列的值。

實施例:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name 
FOR EACH ROW 
SET NEW.COLUMN_NAME = "VALUE"; 
+0

這是一個明智而合理的迴應。它幫助我適當地解決了錯誤。謝謝! – itsraghz