2013-07-18 118 views
1

這是我的創建觸發器。我希望當插入vhftofass它執行這個查詢(更新vhf_msg_rx SET msg_text =「」;)這意味着它使空表這個表vhf_msg_rx.But當我寫插入查詢後查詢它使錯誤(無法更新表'vhf_msg_rx'在存儲函數/觸發,因爲它已經被用於通過調用這個存儲函數/觸發聲明。)請幫助我,我怎麼能做到這一點Mysql觸發器創建錯誤

CREATE 
    /*!50017 DEFINER = 'root'@'localhost' */ 

    TRIGGER `VHFtoFASS` AFTER UPDATE ON `vhf_msg_rx` 
    FOR EACH ROW BEGIN 
    INSERT INTO vhftofass SELECT NULL,msg_text,NOW(),0 FROM vhf_msg_rx WHERE msg_text<>""; 
    END; 
$$ 
+0

http://stackoverflow.com/questions/1582683/mysql-trigger-stored-trigger-is-already-used-by-statement-which-invoked-stored-t –

+0

如果你插入'vhftofass'每次更新'vhf_msg_rx'時,爲什麼需要在每個*場合的後一個表中插入每個非空的'msg_text'?如果'NEW.msg_text'現在是非空的,那麼只需將新更新的記錄插入'vhftofass'就足夠了?這將避免必須從鎖定的表讀取。 – eggyal

+0

正如你發現的那樣,在MySQL中,你不能修改分配給該表的更新觸發器中的表 - 可能是爲了避免必須處理這可能意味着的遞歸。描述你在這裏做什麼,可能有辦法用BEFORE觸發器做。 –

回答

0

我不是你想要做什麼完全清楚,但似乎你想將一個表的修改行復制到另一個表中,但只保留某些字段。你可以做到這一點的參考與NEW.columnnameFOR EACH ROW循環內插入的記錄,例如

CREATE TRIGGER `VHFtoFASS` AFTER UPDATE ON `vhf_msg_rx` 
FOR EACH ROW BEGIN 
    INSERT INTO vhftofass VALUES(NULL,NEW.msg_text,NOW(), 0); 
END; 

請注意,這隻會處理更新 - 你需要一個INSERT觸發器來捕捉新行。

+0

我瞭解你的代碼。它可以,並插入vhftofass。但如果我想,插入vhftofass表時,vhf_msg_rx表將被截斷。我如何做到這一點? –

+0

你可以嘗試在vhftofass上插入後觸發器,但我認爲vhf_msg_rx可能被鎖定。如果這不起作用,您可以使用計劃事件每隔幾分鐘自動執行一次表格維護。 –

+0

謝謝Paul Dixon,求助。我想用觸發器。 –