MySQL触发器没有被触发?

时间:2012-03-02 04:51:56

标签: mysql triggers

所以这个应该是一个相当直接的触发器,但我的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;

1 个答案:

答案 0 :(得分: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."(在“存储函数的限制”下查看)

所以,相反,你需要使用一个前置插入触发器,并在插入之前执行SET new.country = NewCountry来修复该行。