2011-12-02 36 views
1

在創建下面的觸發器之後,當我嘗試執行更新時,出現錯誤(在代碼後詳述)。無論我走哪條路,我似乎都無法更新表格。我是否必須創建一個新表格並在其中添加一列用於更新,或者有解決方法嗎? This page說:「在存儲的函數或觸發器中,不允許修改調用該函數或觸發器的語句已在使用(用於讀取或寫入)的表。」但是,NEW和OLD關鍵字有什麼意義?我只是不正確地使用它們嗎?mySQL觸發器無法更新調用觸發器的語句已在使用的表

表:像冊

列:重量,改性劑,評級

觸發:updateRating

CREATE TRIGGER updateRating 
BEFORE UPDATE ON gallery 
FOR EACH ROW 
UPDATE gallery SET rating= sum(NEW.weight * NEW.modifier) 

CREATE TRIGGER updateRating 
AFTER UPDATE ON gallery 
FOR EACH ROW 
UPDATE gallery SET rating= sum(weight * modifier) 

SQL查詢:編輯

UPDATE`acs`.`gallery` SET`weight` = '6' WHERE`gallery`.`id` = 1 LIMIT 1

MySQL表示:文件

#1442 - 無法更新在存儲函數/觸發器中的表'庫',因爲它已經被調用該存儲函數/觸發器的語句使用。

回答

5

正確,錯誤表示您不能修改gallery表,因爲觸發器是使用此表定義的。還有就是要更新值一種可能的方式,它是一個BEFORE UPDATE觸發器,這裏是一個例子 -

CREATE TRIGGER updateRating 
BEFORE UPDATE 
ON gallery 
FOR EACH ROW 
BEGIN 
    SET NEW.rating= NEW.weight * NEW.modifier; -- You may update a NEW value. 
END 

最後,請允許我問一個問題。你爲什麼要使用觸發器來修改rating?我想說,你可以在SELECT語句中即時計算rating

+0

不得不刪除BEGIN/END關鍵字,因爲只有一個語句要運行(目前),但是這很有效。感謝您澄清我可以改變NEW.rating,但不僅僅是直接在桌上進行評分。你是對的,我可以使用一個即時的SELECT語句。儘管如此,我還是想在其他方面加入其他內容,所以這就是爲什麼我想弄明白。 – SimonDever

相關問題