mysql存储过程简单介绍参见:http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html
笔者使用的是SQLyog管理工具,具体的业务需求如下:
现有72万文章数据paper_class_title_word,有id,title,class,class2等字段,现需要将按照class2分组,每个组取1000个数据到新的表paper_class_title_word_1000中。
首先需要用到的第一个存储过程是:
DELIMITER //
CREATE PROCEDURE Select_1000_row_to_new_talbe(IN Inclass2 VARCHAR(255),IN Cnt INT)
BEGIN
INSERT INTO paper_class_title_word_1000(old_id,title,class,class2) SELECT old_id,title,class,class2 FROM paper_class_title_word WHERE class2 = Inclass2 ORDER BY id LIMIT Cnt;
END;//
参数Inclass2 是class2的值,Cnt是需要移动的数据个数。
注意:DELIMITER // 的意思是将//作为语句结束位置,如果不使用该语句,则会报错,因为mysql默认碰到“分号——;”就会去执行。
为了将每个类都执行相应的操作,则需要使用循环来完成,为了方便获取循环中的class2参数值,将72万文章数据进行组合并导入到一个新表中paper_class2_cnt。
INSERT INTO paper_class2_cnt(class2,cnt) SELECT class2,COUNT(class2) FROM paper_class_title_word GROUP BY class2 ORDER BY COUNT(class2) DESC
部分数据如下,
这样就可以利用i来循环 ,根据每个i来取class2的值。
于是有了第二个存储过程:
DELIMITER //
CREATE PROCEDURE Select_1000_row_to_new_table_all()
BEGIN
DECLARE i INT;
SET i = 0;
LOOP_LABLE:LOOP
SELECT class2 FROM paper_class2_cnt WHERE id = i INTO @tempClass;
CALL Select_1000_row_to_new_talbe(@tempClass, 1000);
SET i=i+1;
IF i > 119 THEN
LEAVE LOOP_LABLE;
END IF;
END LOOP;
END;//
笔者目前还不知道有没有类似容器或者数据集之类的东西,也就是可以保存符合条件的所有的class2的值,那样就必使用id来取class2的值,直接遍历结果集就可以了。
通过本次尝试,感受到了mysql存储过程的强大,在之前很多这样的任务都是使用程序实现的,和存储过程比较起来,麻烦多了。