使用IP自动填充表,具体取决于CIDR网络掩码

时间:2016-08-21 10:01:37

标签: mysql linux ip cidr

我有2个表cidrip

在第一个中我存储了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

1 个答案:

答案 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;