1

我有一个 MariaDB 数据库,我有一个包含anduserInfo列的表。我想要另一列命名并自动从中获取国家并将其插入列中。我已经导入了 GeoIPLite2 并且已经有一个 SQL 查询,但我不知道如何使用 make mariadb 来做它而不是在我的代码上做它。ipAddresscountrycountryipAddresscountry

SELECT a.country_name
FROM geoipcountries a, geoipblocks b
WHERE INET_ATON('1.2.3.4') BETWEEN network_start_integer AND network_last_integer
AND b.geoname_id = a.geoname_id

这个查询给了我国家名称。我希望 MySQL从上面的查询输出中设置表中country列的值。userInfo

我也已经写了这个函数:

DELIMITER $$
CREATE FUNCTION getIpCountry(ip varchar(15)) RETURNS varchar(64)
BEGIN
declare result varchar(64);
select SQL_CACHE a.country_name into result FROM geoipcountries a, geoipblocks b WHERE INET_ATON(ip) BETWEEN network_start_integer AND network_last_integer AND b.geoname_id = a.geoname_id;
if (result is null) or (result = '') then
set result := 'unknown';
end if; 
return result;
END$$
DELIMITER ;
4

2 回答 2

1

考虑到您的表格,userInfo并且您希望您的country列基于ipAddress. 利用CREATE TRIGGER

DELIMITER $$

CREATE TRIGGER `userinfo_before_insert` BEFORE INSERT ON `userInfo` FOR EACH ROW BEGIN
    SET NEW.country = getIpCountry(NEW.ipAddress);
END $$

注意:如果ipAddress可以为空,因此请确保在函数getIpCountry函数中处理它。

同样,您也可以参加update活动。

DELIMITER $$

CREATE TRIGGER `userinfo_before_update` BEFORE UPDATE ON `userInfo` FOR EACH ROW BEGIN
    SET NEW.country = getIpCountry(NEW.ipAddress);
END $$

现在只需country从两者中跳过列INSERTUPDATE查询并确保包含ipAddress. 如下所示

INSERT INTO userInfo(user_id, ipAddress) VALUES (1, '172.16.6.20');

UPDATE userInfo SET ipAddress = '172.16.6.20' WHERE user_id = 1;
于 2020-10-18T16:03:23.533 回答
1

如果您想在一个目标中更改所有县名

做一个

UPDATE userInfo SET `country`= getIpCountry(`ipAddress `);

但是今天我们使用连接而不是逗号分隔的表

DELIMITER $$
CREATE FUNCTION getIpCountry(ip varchar(15)) RETURNS varchar(64)
BEGIN
declare result varchar(64);
SELECT 
    a.country_name
INTO result 
FROM
    geoipcountries a
        INNER JOIN
    geoipblocks b ON b.geoname_id = a.geoname_id
WHERE
    INET_ATON(ip) BETWEEN network_start_integer AND network_last_integer;
if (result is null) or (result = '') then
set result := 'unknown';
end if; 
return result;
END$$

DELIMITER ;

要自动执行此操作,您需要一个 BEFORE INSERT TRIGGER

DELIMITER $$

CREATE TRIGGER before_userInfo_insert
BEFORE INSERT
ON userInfo  FOR EACH ROW
BEGIN
    SET NEW.`country`= getIpCountry(NEW.`ipAddress `);

END $$

DELIMITER ;

和一个BEFORE UPDATE TRIGGER

CREATE TRIGGER before_userInfo_update
BEFORE UPDATE
ON userInfo  FOR EACH ROW
BEGIN
    SET NEW.`country`= getIpCountry(NEW.`ipAddress `);

END $$

DELIMITER ;
于 2020-10-18T16:04:03.793 回答