2012-07-08 68 views
0

所以我已經編輯我的代碼 我在另一個觸發這個問題,但這個時間甚至可更改WHERE子句不利於MySQL的觸發器不能更新表:已經通過調用該觸發器的語句使用

DELIMITER $$ 

CREATE TRIGGER pic_album_change AFTER UPDATE ON pictures 
    FOR EACH ROW BEGIN 
    UPDATE albums SET counter = counter + 1 WHERE albums.id = NEW.album_id; 
    UPDATE albums SET counter = counter - 1 WHERE albums.id = OLD.album_id; 


END $$ 
DELIMITER ; 

錯誤:

<p>Error Number: 1442</p><p>Can't update table 'pictures' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

我沒有看到在這個觸發器中的照片表進行任何修改

我還有一個觸發器,它涉及到這兩個表

DELIMITER $$ 
CREATE TRIGGER album_change 
    AFTER UPDATE 
    ON albums 
    FOR EACH ROW 
BEGIN 
    UPDATE pictures 
    SET 

     level = NEW.level 


    WHERE 
    pictures.album_id = NEW.id ; 


END $$ 
DELIMITER ; 
+0

http://stackoverflow.com/questions/9227382/cant-update-table-that-trigger-is-executed-on-in-after-insert – Samson 2012-07-08 09:32:15

+2

我認爲你的WHERE子句是錯誤的方法回合。 'WHERE albums.id = NEW.album.id'會導致'albums.counter'增加(大概是每張專輯中的圖片數量)。 – 2012-07-08 09:33:37

+0

@radashk感謝您的鏈接,但正如我所說我的觸發器沒有附在同一張桌子上 – max 2012-07-08 09:39:03

回答

0

您的WHERE子句是錯誤的方法。

WHERE albums.id = NEW.album_id 

會導致albums.counter將遞增(大概這就是圖片的每張專輯的數量)。

這很重要,因爲加入表格不可交換—連接的方向很重要。在這裏,您需要根據pictures中的行值找到albums中的記錄進行更新。

雖然在這種情況下沒有任何含糊之處,SQL需要遵循關於連接的規則。


第二個觸發器的問題是MySQL阻止了連續的更新週期。當更新pictures時,您有觸發pic_album_change,其更新albums。當你更新albums時,你有一個觸發器album_change,它會更新pictures。這些觸發器將觸發對方。

在我看來,數據庫設計可能需要改變。如果可以使用SELECT count(*) FROM pictures WHERE album_id=...找到該數據,您真的需要albums.counter嗎?應該可以規範化數據,以便觸發器中不存在循環引用。事實上,觸發器可能根本就沒有必要。

+0

thanx安德魯抱歉打擾你,但我有他在另一個觸發器相同的問題。我不知道可能是什麼問題。我沒有編輯我的代碼 – max 2012-07-08 10:36:13

+0

@max我不認爲這是整個編輯舊問題的原因,因爲這會使答案無效。事實上,其他觸發因素可能會影響這個人的行爲。你有什麼其他觸發'圖片'? – 2012-07-08 11:56:36

+0

對不起,你對我不應該編輯這個問題。但我發現另一個觸發器,涉及這兩個表我認爲我必須以某種方式合併或重寫它們,所以它們不會相互衝突 – max 2012-07-08 16:03:23