So this should be a fairly straight forward trigger, but my MySQL isn’t great, so it’s undoubtably a failure on my part.
It’s not updating the stats table at all, even though it should be;
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;
Well, first off, your
UPDATE—if it works at all—is changing all rows in thestatstable, and its doing that for each row inserted. That really doesn’t make much sense. At minimum, you want to add a where clause to only hit the one row you’ve just inserted.Apparently, though, that can’t work at all in MySQL, because “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.” (Look under “Restrictions for Stored Functions”)
So, instead, you need to use a a before insert trigger, and do a
SET new.country = NewCountryto fix the row up before its ever inserted.