2012-03-02 159 views
0

所以這應該是一個相當直接的觸發器,但我的MySQL並不好,所以這無疑是我的失敗。
它根本沒有更新統計表,即使它應該是;MySQL觸發器沒有被觸發?

DROP TRIGGER countryUpdate; 

DELIMITER // 

CREATE TRIGGER countryUpdate AFTER INSERT ON stats 
FOR EACH ROW BEGIN 
    DECLARE NewIP varchar(16); 
    DECLARE NewCountry varchar(80); 
    SET NewIP = inet_aton(new.vis_ip); 
    SET NewCountry = (SELECT country FROM iptocountry WHERE lower_bound <= NewIP AND upper_bound >= NewIP) 
    UPDATE stats 
     SET Country = NewCountry 

END // 

DELIMITER; 
+0

什麼是錯誤信息? – 2012-03-02 04:58:03

+0

沒有錯誤,它litterally似乎並沒有被觸發。 統計信息表中的國家/地區列不會隨國家/地區更新。 – FizzBuzz 2012-03-02 05:08:32

回答

3

嗯,首先,你UPDATE - 如果它在所有工作,正在改變stats表中的所有行,它這樣做,對插入的每一行。這確實沒有多大意義。至少,你想添加一個where子句來只打你剛剛插入的那一行。

很顯然,雖然不能在所有在MySQL工作,因爲"a stored function or trigger cannot modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger."(看在「限制爲存儲函數」)

所以,相反,你需要插入扳機之前,使用AA,並做了SET new.country = NewCountry在其插入之前修好排。

+0

缺乏where子句的好處。想象一下在生產中進行調試。 – 2012-03-02 05:14:47

+0

哦,是的,謝謝你的指針。問題仍然存在,雖然行沒有得到更新......對此有任何想法? – FizzBuzz 2012-03-02 05:18:52

+0

@FizzBu​​zz噢,那是因爲你無法更新已經在使用的表,它是MySQL的一個已知限制 - 我會更新我的答案。 (對不起,以前會把它放進去,但是我記得那個,並且看了看) – derobert 2012-03-02 05:45:30