首页 文章

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

提问于
浏览
0

我有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

    Procedure:

    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 表中 .

    Test:

    CALL populateProcedure(1);
    

    这将在此ip系列 14.44.182.0/24 下的 ip 表中插入256个条目

    Test Schema & Data:

    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;
    

相关问题