大虾们好, 我对存储过程不太熟悉, 但是这个东西要快出来, 所以没时间去学习了, 先请大家帮帮忙啊需求如下: 表结构为
[code=SQL]
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `begin_ip` int(10) unsigned NOT NULL COMMENT '开始ip',
  `end_ip` int(10) unsigned NOT NULL COMMENT '结束ip',
  `pool_id` int(10) unsigned NOT NULL COMMENT '权重最大的pool_id',
  `region_id` int(10) unsigned NOT NULL COMMENT 'ip段所属的地域id',
  PRIMARY KEY (`id`)
code]现在一次性插入100万条数据, 然后执行存储过程, 这个存储过程的作用是:
假如 插入了 192.168.11.1(begin_ip) 192.168.11.255(end_ip), 就要把小于这个范围的删除
比如192.168.11.2(begin_ip) 192.168.11.224(end_ip),这条记录就要删除
你们可以把begin_ip和end_ip看做数值型的
也就是说, 如果插入了 222(begin_ip) 333(end_ip), 那么在这个222-333之间的记录就要删除
不知道说明白了没?
 谢谢大家

解决方案 »

  1.   

    这个sql 就可以完成了,为什么要用存储过程呢?
      

  2.   

    delete from tb
    where begin_ip between 222 and 333 and end_ip between 222 and 333
      

  3.   

    我要插入100w条数据, 如果用java程序的话, 每次去过滤的话, 把100w条数据放入List中去过滤, 会很慢的
    大概1分钟左右, 所以我想用存储过程去实现, 等一次插入完成后去执行过滤操作
    删除被包括的IP段, 懂了吗? 
    谢谢大家
      

  4.   

    呵呵, 搞定了, 依旧谢谢大家!
     代码如下:CREATE PROCEDURE `delete_domain`(tableName varchar(255) UNSIGNED)
    BEGIN
    DECLARE Done INT DEFAULT 0;
    DECLARE Join_num INT DEFAULT 0;
    DECLARE Row_id_cur INT UNSIGNED;
    DECLARE End_ip_cur INT UNSIGNED;
    DECLARE Row_id_next INT UNSIGNED;
    DECLARE End_ip_next INT UNSIGNED; /* 声明游标 */
      DECLARE rs CURSOR FOR SELECT id,end_ip FROM tableName order by begin_ip asc,end_ip desc;  /* 异常处理 */
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;
      
      /* 打开游标 */
      OPEN rs;  /* 逐个取出当前记录 */
      FETCH NEXT FROM rs INTO Row_id_cur,End_ip_cur;
      FETCH NEXT FROM rs INTO Row_id_next, End_ip_next;
      
      /* 遍历数据表 */
      REPEAT
    IF NOT Done THEN
    IF End_ip_cur >= End_ip_next THEN
    DELETE FROM tableName WHERE id=Row_id_next;
       FETCH NEXT FROM rs INTO Row_id_next,End_ip_next;
       ELSE
       SET Row_id_cur=Row_id_next;
    SET End_ip_cur=End_ip_next;
    FETCH NEXT FROM rs INTO Row_id_next,End_ip_next;
       END IF;
    END IF;
    UNTIL Done || Row_id_cur IS NULL || Row_id_next IS NULL END REPEAT;
    SELECT Join_num;
    CLOSE rs;
    END