2013-07-04 25 views
3

我有兩個表格,一個登錄表,它捕獲登錄信息,一個範圍表將IP信息與國家相關聯。我試圖創建一個觸發器,通過對範圍表執行連接來更新插入後的logins.country列。加入MySQL觸發器

該表的結構如下這樣:

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; 

任何想法,我要去哪裏錯在這裏?

回答

5

在玩了一段時間之後,我意識到一個連接並不是必要的,而且我使得這個過程比它需要的複雜得多。這裏是最後的觸發器:

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); 
+0

非常感謝! :) –