我有2个表cidr
和ip
。
在第一个中我存储了CIDR网络掩码。 (2列表,id_cidr,cidr),这是一个例子(值是虚构的):
id_cidr | cidr
---------+----------------
1 | 14.44.182.0/24
---------+----------------
2 | 26.232.49.0/22
在第二个我想在每个cidr网络掩码(3列表,id_ip,cidr_id,ip)中存储ip,这是一个例子(值是虚构的):
id_ip | cidr_id | ip
---------+--------------------------
1 | 1 | 14.44.182.0
---------+--------------------------
2 | 1 | 14.44.182.1
---------+--------------------------
3 | 1 | 14.44.182.2
---------+--------------------------
... | 1 | ...
---------+--------------------------
256 | 1 | 14.44.182.255
---------+--------------------------
257 | 2 | 26.232.48.0
---------+--------------------------
258 | 2 | 26.232.48.1
---------+--------------------------
259 | 2 | 26.232.48.2
---------+--------------------------
... | 2 | ...
---------+--------------------------
1280 | 2 | 26.232.51.255
我想要实现的目标如下:每当我向cidr table
添加一个cidr网络掩码时,我希望我的ip table
自动填充该cidr网络掩码中所有ip范围的字段。有没有办法在mysql中实现这个?
注意:要将cidr网络掩码转换为ip的范围,请点击here
答案 0 :(得分:0)
<强>步骤:强>
DELIMITER $$
CREATE PROCEDURE populateIpProcedure(cidrID INT)
BEGIN
DECLARE my_cidr_id INT;
DECLARE my_cidr_str VARCHAR(25);
DECLARE my_initial_ip VARCHAR(15);
DECLARE my_initial_ip_int INT;
DECLARE my_ip_limit INT;
DECLARE my_loop_variable INT DEFAULT 0;
SET my_cidr_id = cidrID;
SELECT cidr INTO my_cidr_str FROM cidr WHERE id_cidr = my_cidr_id;
SELECT
SUBSTRING_INDEX(my_cidr_str,'/',1),SUBSTRING_INDEX(my_cidr_str,'/',-1)+0 INTO my_initial_ip, my_ip_limit;
SET my_ip_limit = (SELECT POWER(2, (32-my_ip_limit)));
SELECT INET_ATON(my_initial_ip) INTO my_initial_ip_int;
WHILE my_loop_variable < my_ip_limit DO
INSERT INTO ip(cidr_id,ip) SELECT my_cidr_id, INET_NTOA(my_initial_ip_int+my_loop_variable);
SET my_loop_variable := my_loop_variable + 1;
END WHILE;
END$$
DELIMITER ;
上述过程将cidr
id作为参数。
然后它按照给定的id从cidr
表中检索记录。
稍后它会将此cidr下的所有ips插入到ip
表中。
<强>测试强>
CALL populateProcedure(1);
这将在此ip系列ip
14.44.182.0/24
表中插入256个条目
测试架构&amp;数据强>
DROP TABLE IF EXISTS `cidr`;
CREATE TABLE `cidr` (
`id_cidr` int(11) NOT NULL AUTO_INCREMENT,
`cidr` varchar(25) NOT NULL,
PRIMARY KEY (`id_cidr`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
INSERT INTO `cidr` VALUES ('1', '14.44.182.0/24');
INSERT INTO `cidr` VALUES ('2', '26.232.49.0/22');
DROP TABLE IF EXISTS `ip`;
CREATE TABLE `ip` (
`id_ip` int(11) NOT NULL AUTO_INCREMENT,
`cidr_id` int(11) NOT NULL,
`ip` char(15) NOT NULL,
PRIMARY KEY (`id_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;