您的位置:首页 > 其它

批量造完备的测试数据

2011-07-12 21:44 288 查看
系统开发完毕后,需要完备测试系统页面的逻辑功能,一条条考虑各种情况往数据库里插数据太麻烦了,为此我写了一个存储过程批量造数据,例子如下,共有三张表wideip,pool,status表 1.其中一个wideip包含多个pool(一对多) 2.status表是一个字典表有初始数据,wideip,pool里都有status_id外键,对应于status表里的id。 初始值为  
  1. INSERT INTO `status` VALUES ('0', 'available');  
  2. INSERT INTO `status` VALUES ('1', 'offline');  
  3. INSERT INTO `status` VALUES ('2', 'unknown');  
  4. INSERT INTO `status` VALUES ('3', 'unavilable'); 
3.pool里的wideip_id是一个外键关联了wideip的id 4.enable标识wideip和pool的开关,只有0,1两个状态  

对于wideip来说,enable(2种变化)和status_id(4种变化)属性是可变的,因此完备的情况有2x4种 对于某个wideip下面的pool来说,enable(2种变化)和status_id(4种变化)属性是可变的,因此完备的情况有2x4种xwideip的变化=2x4x2x4=64种 造数据的过程如下 1.先清空wideip和pool表,恢复自增为1 2.每插一个wideip,针对这个wideip造出8个完备的pool记录 表结构代码:  
  1. SET FOREIGN_KEY_CHECKS=0;  
  2.  
  3. -- ----------------------------  
  4.  
  5. -- Table structure for pool  
  6.  
  7. -- ----------------------------  
  8.  
  9. CREATE TABLE `pool` (  
  10.  
  11.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  12.  
  13.   `name` varchar(255) NOT NULL,  
  14.  
  15.   `wideip_id` int(11) NOT NULL,  
  16.  
  17.   `enable` tinyint(4) NOT NULL,  
  18.  
  19.   `status_id` tinyint(4) NOT NULL,  
  20.  
  21.   PRIMARY KEY (`id`),  
  22.  
  23.   KEY `wideip_pool_fk` (`wideip_id`),  
  24.  
  25.   KEY `status_pool_fk` (`status_id`),  
  26.  
  27.   CONSTRAINT `status_pool_fk` FOREIGN KEY (`status_id`) REFERENCES `status` (`id`),  
  28.  
  29.   CONSTRAINT `wideip_pool_fk` FOREIGN KEY (`wideip_id`) REFERENCES `wideip` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
  30.  
  31. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;  
  32.  
  33.  
  34.  
  35. -- ----------------------------  
  36.  
  37. -- Table structure for status  
  38.  
  39. -- ----------------------------  
  40.  
  41. CREATE TABLE `status` (  
  42.  
  43.   `id` tinyint(4) NOT NULL,  
  44.  
  45.   `name` varchar(255) NOT NULL,  
  46.  
  47.   PRIMARY KEY (`id`)  
  48.  
  49. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;  
  50.  
  51.  
  52.  
  53. -- ----------------------------  
  54.  
  55. -- Table structure for wideip  
  56. -- ----------------------------  
  57. CREATE TABLE `wideip` (  
  58.   `id` int(11) NOT NULL AUTO_INCREMENT,  
  59.   `name` varchar(255) NOT NULL,  
  60.   `enable` tinyint(4) NOT NULL,  
  61.   `status_id` tinyint(4) NOT NULL,  
  62.   PRIMARY KEY (`id`),  
  63.   KEY `status_id` (`status_id`),  
  64.   CONSTRAINT `wideip_ibfk_1` FOREIGN KEY (`status_id`) REFERENCES `status` (`id`)  
  65. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;  
  66. INSERT INTO `status` VALUES ('0', 'available');  
  67. INSERT INTO `status` VALUES ('1', 'offline');  
  68. INSERT INTO `status` VALUES ('2', 'unknown');  
  69. INSERT INTO `status` VALUES ('3', 'unavilable');  

造数据的存储过程

 

  1. /*清空所有数据数据*/  
  2.  
  3. drop procedure if exists clear_all_data;  
  4.  
  5. delimiter ;;  
  6.  
  7. create procedure clear_all_data()  
  8.  
  9. BEGIN 
  10.  
  11.      /*清空数据*/  
  12.  
  13.   delete from wideip;  
  14.  
  15.   /*让自增从1*/  
  16.  
  17.   alter table wideip auto_increment 1;  
  18.  
  19.   /*清空pool数据*/  
  20.  
  21.     delete from pool;  
  22.  
  23.     /*让pool自增从1*/  
  24.  
  25.     alter table pool auto_increment 1;  
  26.  
  27. END;;  
  28.  
  29. delimiter ;  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. drop procedure if exists make_pool_data;  
  36.  
  37. /*造每个wideip对于的pool数据*/  
  38.  
  39. delimiter ;;  
  40.  
  41. create procedure make_pool_data(wideipId int)  
  42.  
  43. BEGIN 
  44.  
  45.   declare d_enable int default 0;  
  46.  
  47.   declare d_status_id int default 0;  
  48.  
  49.   declare isError int default 0;  
  50.  
  51.      declare Done int default 0;  
  52.  
  53.      declare i int default 0;  
  54.  
  55.     
  56.  
  57.         /* 声明游标 */  
  58.  
  59.   DECLARE rs CURSOR FOR select id from status order by id;  
  60.  
  61.     
  62.  
  63.     /* 异常处理 */  
  64.  
  65.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;  
  66.  
  67.   DECLARE CONTINUE HANDLER FOR 1146 SET isError=1;  
  68.  
  69.     
  70.  
  71.     REPEAT  
  72.  
  73.             /* 打开游标 */  
  74.  
  75.         OPEN rs;   
  76.  
  77.         REPEAT  
  78.  
  79.             /*取status_id*/  
  80.  
  81.             FETCH rs INTO d_status_id;  
  82.  
  83.             IF Done!=1 THEN 
  84.  
  85.                 select d_enable,d_status_id;  
  86.  
  87.                 set i=i+1;  
  88.  
  89.                 insert into pool(name,enable,status_id,wideip_id) values(concat("name",wideipId,"_",i),d_enable,d_status_id,wideipId);  
  90.  
  91.             END IF;  
  92.  
  93.         UNTIL d_status_id is NULL or Done=1 END REPEAT;  
  94.  
  95.         CLOSE rs;  
  96.  
  97.         set d_enable=d_enable+1;  
  98.  
  99.         set Done=0;  
  100.  
  101.     UNTIL d_enable >= 2 END REPEAT;  
  102.  
  103. END;;  
  104.  
  105. delimiter ;  
  106.  
  107.  
  108.  
  109.  
  110.  
  111. drop procedure if exists make_wideip_data;  
  112.  
  113. /*造wideip的数据并调用 make_pool_data */  
  114.  
  115. delimiter ;;  
  116.  
  117. create procedure make_wideip_data()  
  118.  
  119. BEGIN 
  120.  
  121.   declare d_enable int default 0;  
  122.  
  123.   declare d_status_id int default 0;  
  124.  
  125.   declare isError int default 0;  
  126.  
  127.      declare Done int default 0;  
  128.  
  129.      declare i int default 0;  
  130.  
  131.      declare newWideipId int default 0;  
  132.  
  133.     
  134.  
  135.         /* 声明游标 */  
  136.  
  137.   DECLARE rs CURSOR FOR select id from status order by id;  
  138.  
  139.     
  140.  
  141.     /* 异常处理 */  
  142.  
  143.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET Done = 1;  
  144.  
  145.   DECLARE CONTINUE HANDLER FOR 1146 SET isError=1;  
  146.  
  147.     
  148.  
  149.     REPEAT  
  150.  
  151.             /* 打开游标 */  
  152.  
  153.         OPEN rs;   
  154.  
  155.         REPEAT  
  156.  
  157.             /*取status_id*/  
  158.  
  159.             FETCH rs INTO d_status_id;  
  160.  
  161.             IF Done!=1 THEN 
  162.  
  163.                 select d_enable,d_status_id;  
  164.  
  165.                 set i=i+1;  
  166.  
  167.                 insert into wideip(name,enable,status_id) values(concat("name",i),d_enable,d_status_id);  
  168.  
  169.                 set newWideipId=last_insert_id();  
  170.  
  171.              call make_pool_data(newWideipId);  
  172.  
  173.             END IF;  
  174.  
  175.         UNTIL d_status_id is NULL or Done=1 END REPEAT;  
  176.  
  177.         CLOSE rs;  
  178.  
  179.         set d_enable=d_enable+1;  
  180.  
  181.         set Done=0;  
  182.  
  183.     UNTIL d_enable >= 2 END REPEAT;  
  184.  
  185. END;;  
  186.  
  187. delimiter ;  

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: