2012-06-28 74 views
3

我寫了一個插入觸發器。宇。mysql - 對於每一行

下一步是我想在觸發器運行後運行查詢或過程。所以不是插入每個記錄,而是插入後。

我在哪裏打這個電話?

DELIMITER $$ 
DROP TRIGGER /*!50033 IF EXISTS */ triggername $$ 


CREATE TRIGGER triggername 
AFTER INSERT ON tableA 
FOR EACH ROW 
BEGIN 

/*This runs for each insert - I want it to run at the end of the trigger*/ 
CALL UpdateOtherStuff(NEW.fieldA, NEW.fieldB); 

END$$ 

謝謝,

+0

是否必須在所有插入完成後運行,或者在第一次插入後只運行一次就足夠了?實際上,更重要的是,如果您不是指單個插入的記錄,那麼程序參數'NEW.fieldA'和'NEW.fieldB'會引用什麼? – eggyal

+0

是在所有插入完成後。我會從過程中刪除參數,並在所有插入操作後重新寫入參數。 –

+0

如果多插入語句插入10行,則要在插入10行後調用該過程。但是,如果應用程序選擇通過單獨的'INSERT'語句插入這10行,則仍然會分10次調用該過程。應用程序的實現細節是否真的以這種方式影響數據庫行爲?如果在每一行之後調用這個過程(就像你現在所做的那樣),或者通過事件調度程序定期調用過程,如果不需要任何東西(例如,你可以跟蹤已經處理過的行) )? – eggyal

回答

3

MySQL的觸發語法是有限的。你不能在同一個表上有多個觸發器。您不能擁有數據庫級觸發器。

總之,你不能這樣做,因爲MySQL不知道你是插入1000個值還是隻插入一個值。即使你從一個單獨的語句觸發它們,它們也是單獨的事件。

FOR EACH ROWCREATE TRIGGER語法的固定部分,它不是可選的。

當我遇到同樣的問題時,我實現了存儲函數並使用這些函數來執行插入代碼和更新代碼。

函數和存儲過程的限制很多,例如無法傳遞可變數量的參數給它們(如可以傳遞給插入/更新)或無法將WHERE子句傳遞給它們,以至於它們可以過濾他們正在影響的內容。

但你可以克服過濾限制象這樣:

CREATE FUNCTION x(id INTEGER) ... 

SELECT x(object_id) FROM objects WHERE ... 

我不知道如果MySQL將優化本作中,執行權當場功能,具有對象數據不需要在功能中重新選擇它。但我認爲它不......它認爲函數內部的更新查詢按照慣例運行。

+0

謝謝你。我不知道觸發器的限制。 –