Linux 下mysql通过存储过程实现批量生成记录网赌平台哪个信誉好:

Linux 下mysql通过存储过程实现批量生成记录

最近有个特别变态的业务需求,有一张表

在开发中有一个这样的需求:需要在数据库的表中生成大量的记录,这些记录只有很少的差别,只会在创建表的时候进行一次这个操作。当然,要是人工一条一条的做也不是不可以,也可以用外部的程序来完成,但是这里我选择使用mysql的存储过程来实现。

CREATE TABLE `demo` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `tid` int(11) DEFAULT '0',
 `pid` int(11) DEFAULT '1',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8;

0、相关版本信息

大概就是这样,有300多万行记录,每个pid记录的这个ID的最顶级分类,tid是它的上级分类!
现在需求是:通过指定一个ID,查找出它的所有子集成员,并修改这个pid的值为新指定的值!!
在PHP中跑了一下,执行时间大概需要50秒+,很是痛苦!!!
需要递归找出所有子集,修改它的pid,工作量还是蛮大的。

        mysql使用官方打包发布的5.6.29版本,安装在linux上

而oracle中有一个方法是connect_by_isleaf,可以很方便的找出所有子集,但我是MySQL……

1、数据表结构

所以用这儿简单的写写用MySQL的方法或存储过程实现的经验

       
表有一个自增的主键,另外有一个字段是需要保存的有少许差异的信息,另外有一个字段是其他信息,创建表的代码:

第一种:MySQL的方法

DROP TABLE IF EXISTS `t_vpn_ip`;
CREATE TABLE `t_vpn_ip` (
  `r_id`       int(16)     NOT NULL  AUTO_INCREMENT,
  `ipaddr`      varchar(16)   NOT NULL  UNIQUE,
  `cc_id`       int(16)     NOT NULL  DEFAULT 0,
  PRIMARY KEY (`r_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) RETURNS text CHARSET utf8
  READS SQL DATA
  COMMENT 'demo'
BEGIN

DECLARE sTemp text;
DECLARE sTempChd text;

SET sTempChd =cast(rootId as CHAR);
SET sTemp = '';

WHILE sTempChd is not null DO
  SET sTemp = concat(sTemp,',',sTempChd);
  SELECT group_concat(id) INTO sTempChd FROM demo where FIND_IN_SET(tid,sTempChd)>0;
END WHILE;

RETURN sTemp;

END;

2、存储过程的创建、调用、删除

使用方法就是

       
存储过程中使用循环来生成大量的记录。由于这个生成操作只执行一次,所以在调用后就将其删除。

select lvtao_demo_a(5);
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图