【问题标题】:MySQL trigger with joinMySQL 触发器与连接
【发布时间】:2013-07-02 21:28:04
【问题描述】:

我有两个表,一个捕获登录信息的登录表,以及一个将 IP 信息与国家/地区相关联的范围表。我正在尝试创建一个触发器,该触发器在插入后通过对范围表执行连接来更新 logins.country 列。

表格的结构如下:

CREATE TABLE logins (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
users_id int(10) unsigned NOT NULL,
ip int(10) unsigned NOT NULL,
country varchar(2) DEFAULT NULL,
status tinyint(4) NOT NULL,
timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE ranges (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
first int(10) unsigned NOT NULL,
last int(10) unsigned NOT NULL,
country varchar(2) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY first_UNIQUE (first),
UNIQUE KEY last_UNIQUE (last)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我有这个触发器,但它似乎不起作用:

CREATE TRIGGER update_country
AFTER INSERT ON logins
FOR EACH ROW
UPDATE logins l
JOIN ranges r ON l.ip >= first AND l.ip <= last
SET l.country = r.country
WHERE l.id = NEW.id;

知道我哪里出错了吗?

【问题讨论】:

    标签: mysql triggers geolocation


    【解决方案1】:

    在玩了一段时间之后,我意识到加入并不是必需的,而且我让这个变得比它需要的复杂得多。这是最终的触发器:

    CREATE TRIGGER update_country BEFORE INSERT
    ON logins FOR EACH ROW
    SET NEW.country = (SELECT country FROM ranges WHERE NEW.ip >= first AND NEW.ip <= last);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-31
      • 2013-04-09
      • 2011-06-19
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2011-04-12
      相关资源
      最近更新 更多