所以这个应该是一个相当直接的触发器,但我的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 :(得分: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
来修复该行。