大虾们好, 我对存储过程不太熟悉, 但是这个东西要快出来, 所以没时间去学习了, 先请大家帮帮忙啊需求如下: 表结构为
[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之间的记录就要删除
不知道说明白了没?
谢谢大家
[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之间的记录就要删除
不知道说明白了没?
谢谢大家
where begin_ip between 222 and 333 and end_ip between 222 and 333
大概1分钟左右, 所以我想用存储过程去实现, 等一次插入完成后去执行过滤操作
删除被包括的IP段, 懂了吗?
谢谢大家
代码如下: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