MySQL數字輔助表

壹頁書發表於2014-12-10
最近在做一個活動簽到的功能,每個使用者每天簽到,累計到一定次數,可以換一些獎品。
簽到表的設計如下

  1. CREATE TABLE `award_chance_history` (
  2.   `id` int(11) NOT NULL AUTO_INCREMENT,
  3.   `awardActId` int(11) DEFAULT NULL COMMENT '活動id',
  4.   `vvid` bigint(20) DEFAULT NULL COMMENT '使用者id',
  5.   `createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '簽到時間',
  6.   `reason` varchar(40) DEFAULT NULL COMMENT '事由',
  7.   `AdditionalChance` int(11) DEFAULT '0' COMMENT '積分變動',
  8.   `type` int(11) DEFAULT NULL COMMENT '型別',
  9.   `Chance_bak` int(11) DEFAULT '0',
  10.   PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

到了測試的階段,問題來了。
測試需要讓我做一批資料,模擬使用者簽到了20天,30天..以便測試.
這在Oracle都不是事兒,用Connect By直接可以解決.
但是MySQL沒有這個功能,
一開始,我是這麼做的


這種場景其實可以用數字輔助表的方式,在MySQL技術內幕(SQL)中有記錄
首先,建立數字輔助表

  1. create table nums(id int not null primary key);

  2. delimiter $$
  3. create procedure pCreateNums(cnt int)
  4. begin
  5.     declare s int default 1;
  6.     truncate table nums;
  7.     while s<=cnt do
  8.         insert into nums select s;
  9.         set s=s+1;
  10.     end while;
  11. end $$
  12. delimiter ;

  13. delimiter $$
  14. create procedure pFastCreateNums(cnt int)
  15. begin
  16.     declare s int default 1;
  17.     truncate table nums;
  18.     insert into nums select s;
  19.     while s*2<=cnt do
  20.         insert into nums select id+s from nums;
  21.         set s=s*2;
  22.     end while;
  23. end $$
  24. delimiter ;
初始化資料
call pFastCreateNums(10000);

建立測試資料
  1. insert into award_chance_history(awardactid,vvid,reason,additionalChance,type,createtime)
  2. select 12,70021346,'手機簽到測試',10,2,date_add('2014-12-14',interval id day) from nums order by id limit 10;
這樣就建立了從 2014-12-15以後的連續10天簽到資料.


方便多了..

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1362897/,如需轉載,請註明出處,否則將追究法律責任。

相關文章