Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4178947
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: Mysql/postgreSQL

2014-03-06 11:26:12

PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression。  
MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? 我想到的三种方法如下:
1. 用存储过程来做。 缺点是写好多数据库不擅长的应用逻辑。
2. 我们想到MySQL提供了SESSION 变量这样的特性, 可以很方便的完成同样的功能。
3. MariaDB 提供了一种sequence 引擎,也可以方便的做这件事情。


第一种我就不实现了, 我来举例说明后两种。



点击(此处)折叠或打开

  1. 表结构如下:
  2. ytt[love]>show create table test_series;
  3. +-------------+-------------------------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table |
  5. +-------------+-------------------------------------------------------------------------------------------------------------------------+
  6. | test_series | CREATE TABLE `test_series` (
  7.   `id` int(11) NOT NULL,
  8.   `log_date` date NOT NULL
  9. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
  10. +-------------+-------------------------------------------------------------------------------------------------------------------------+
  11. 1 row in set (0.00 sec)


  12. 对应的PostgreSQL 运算结果:
  13. t_girl=# insert into test_series select seq, current_date - '1 day'::interval*seq from generate_series(1,20) as g(seq);
  14. INSERT 0 20
  15. t_girl=# select * from test_series;
  16.  id | log_date
  17. ----+------------
  18.   1 | 2014-03-02
  19.   2 | 2014-03-01
  20.   3 | 2014-02-28
  21.   4 | 2014-02-27
  22.   5 | 2014-02-26
  23.   6 | 2014-02-25
  24.   7 | 2014-02-24
  25.   8 | 2014-02-23
  26.   9 | 2014-02-22
  27.  10 | 2014-02-21
  28.  11 | 2014-02-20
  29.  12 | 2014-02-19
  30.  13 | 2014-02-18
  31.  14 | 2014-02-17
  32.  15 | 2014-02-16
  33.  16 | 2014-02-15
  34.  17 | 2014-02-14
  35.  18 | 2014-02-13
  36.  19 | 2014-02-12
  37.  20 | 2014-02-11
  38. (20 rows)




第一: SESSION 变量。


MySQL 的SESSION 变量来变相实现的话,需要一个种子库。


点击(此处)折叠或打开

  1. 以下存储过程生成种子库。
  2. DELIMITER $$


  3. USE `t_girl`$$


  4. DROP PROCEDURE IF EXISTS `sp_seed`$$


  5. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_seed`(
  6.     IN f_num INT UNSIGNED
  7.     )
  8. BEGIN
  9.     
  10.     DROP TABLE IF EXISTS tmp_seed;
  11.     CREATE TEMPORARY TABLE tmp_seed (id INT);
  12. BEGIN
  13.  DECLARE i INT;
  14.  SET i = 1;
  15.  WHILE i <= f_num DO
  16.    INSERT INTO tmp_seed VALUES (i);
  17.    SET i = i + 1;
  18.  END WHILE;
  19.  
  20. END;
  21.     
  22.        
  23.     END$$


  24. DELIMITER ;


  25. 生成20个种子库
  26. ytt[love]>call sp_seed(20);
  27. Query OK, 1 row affected (0.15 sec)


  28. 现在利用刚才的种子库以及SESSION 变量来实现。
  29. ytt[love]>insert into test_series select @a := @a + 1 as seq, date_sub(current_date(), interval @a day) from tmp_seed,(select @a:=0) as seq;
  30. Query OK, 20 rows affected (0.02 sec)
  31. Records: 20 Duplicates: 0 Warnings: 0


  32. ytt[love]>select * from test_series;
  33. +----+------------+
  34. | id | log_date |
  35. +----+------------+
  36. | 1 | 2014-03-02 |
  37. | 2 | 2014-03-01 |
  38. | 3 | 2014-02-28 |
  39. | 4 | 2014-02-27 |
  40. | 5 | 2014-02-26 |
  41. | 6 | 2014-02-25 |
  42. | 7 | 2014-02-24 |
  43. | 8 | 2014-02-23 |
  44. | 9 | 2014-02-22 |
  45. | 10 | 2014-02-21 |
  46. | 11 | 2014-02-20 |
  47. | 12 | 2014-02-19 |
  48. | 13 | 2014-02-18 |
  49. | 14 | 2014-02-17 |
  50. | 15 | 2014-02-16 |
  51. | 16 | 2014-02-15 |
  52. | 17 | 2014-02-14 |
  53. | 18 | 2014-02-13 |
  54. | 19 | 2014-02-12 |
  55. | 20 | 2014-02-11 |
  56. +----+------------+
  57. 20 rows in set (0.00 sec)





第二: 
MySQL(MariaDB ) 提供了一个序列引擎,可以有这样的功能。
由于MySQL 没有表函数功能,所以如果要造多个字段的数据,就得用JOIN来实现了。


点击(此处)折叠或打开

  1. ytt[love]>insert into test_series select s1.seq,date_sub(current_date(),interval s2.seq day) as date from seq_1_to_20 as s1, seq_1_to_20 as s2 where s1.seq = s2.seq;
  2. Query OK, 20 rows affected (0.07 sec)
  3. Records: 20 Duplicates: 0 Warnings: 0


  4. ytt[love]>select * from test_series;
  5. +----+------------+
  6. | id | log_date |
  7. +----+------------+
  8. | 1 | 2014-03-02 |
  9. | 2 | 2014-03-01 |
  10. | 3 | 2014-02-28 |
  11. | 4 | 2014-02-27 |
  12. | 5 | 2014-02-26 |
  13. | 6 | 2014-02-25 |
  14. | 7 | 2014-02-24 |
  15. | 8 | 2014-02-23 |
  16. | 9 | 2014-02-22 |
  17. | 10 | 2014-02-21 |
  18. | 11 | 2014-02-20 |
  19. | 12 | 2014-02-19 |
  20. | 13 | 2014-02-18 |
  21. | 14 | 2014-02-17 |
  22. | 15 | 2014-02-16 |
  23. | 16 | 2014-02-15 |
  24. | 17 | 2014-02-14 |
  25. | 18 | 2014-02-13 |
  26. | 19 | 2014-02-12 |
  27. | 20 | 2014-02-11 |
  28. +----+------------+
  29. 20 rows in set (0.00 sec)




阅读(5247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~