【问题标题】:Auto-populate table with IP's depending on CIDR netmask根据 CIDR 网络掩码使用 IP 自动填充表
【发布时间】:2016-12-28 00:41:27
【问题描述】:

我有 2 张桌子 cidrip

在第一个中,我存储 CIDR 网络掩码。 (2列表,id_cidr,cidr),这里是一个例子(值是虚构的):

 id_cidr |     cidr
---------+----------------
    1    | 14.44.182.0/24
---------+----------------
    2    | 26.232.49.0/22

在第二个中,我想将 ip 存储在每个 cidr 网络掩码中(3 列表,id_ip,cidr_id,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 网络掩码添加到 cidr table 时,我希望我的 ip table 使用该 cidr 网络掩码内的所有 IP 范围自动填充字段。有没有办法在mysql中实现这一点?

注意:要将 cidr 网络掩码转换为 ip 的范围点击here

【问题讨论】:

  • 在这个ip series = 26.232.49.0/22下生成的第一个ip地址是26.232.48.0。是预期的吗?并告诉我们您更喜欢调用一个过程来填充第二个表吗?
  • 你是对的,我犯了一个错误,我更正了。是的,我猜除了 PHP 之外的一些程序或任何其他解决方案。所以从 mysql 开始,我问这个是因为我对高级 mysql 没有经验。
  • 你想要什么听起来你想要触发它。但是不鼓励在触发器内调用过程。但如果我是你,那么我会这样做:1)插入cidr表2)获取最后一个插入id 3)调用提供最后插入的cidr id和cidr本身的过程以便插入ip
  • 这对你有用吗@我的here,特别是有 1 行显示this 的表格...少管家

标签: mysql linux ip cidr


【解决方案1】:

程序:

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系列14.44.182.0/24下的ip表中插入256个条目

测试架构和数据:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 2016-12-27
    • 2014-10-26
    • 1970-01-01
    • 2018-10-29
    • 2020-12-22
    • 2021-06-02
    • 2017-10-29
    相关资源
    最近更新 更多