PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression。

MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? 我想到的三种方法如下:

1. 用存储过程来做。 缺点是写好多数据库不擅长的应用逻辑。

2. 我们想到MySQL提供了SESSION 变量这样的特性, 可以很方便的完成同样的功能。

3. MariaDB 提供了一种sequence 引擎,也可以方便的做这件事情。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
表结构如下:
ytt[love]>show create table test_series;
+-------------+-------------------------------------------------------------------------------------------------------------------------+
Table       Create Table                                                                                                            |
+-------------+-------------------------------------------------------------------------------------------------------------------------+
| test_series | CREATE TABLE `test_series` (
  `id` int(11) NOT NULL,
  `log_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
对应的PostgreSQL 运算结果:
t_girl=# insert into test_series select seq, current_date '1 day'::interval*seq from generate_series(1,20) as g(seq);
INSERT 0 20
t_girl=# select from test_series;
 id |  log_date
----+------------
  1 | 2014-03-02
  2 | 2014-03-01
  3 | 2014-02-28
  4 | 2014-02-27
  5 | 2014-02-26
  6 | 2014-02-25
  7 | 2014-02-24
  8 | 2014-02-23
  9 | 2014-02-22
 10 | 2014-02-21
 11 | 2014-02-20
 12 | 2014-02-19
 13 | 2014-02-18
 14 | 2014-02-17
 15 | 2014-02-16
 16 | 2014-02-15
 17 | 2014-02-14
 18 | 2014-02-13
 19 | 2014-02-12
 20 | 2014-02-11
(20 rows)

第一: SESSION 变量。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
以下存储过程生成种子库。
DELIMITER $$
USE `t_girl`$$
DROP PROCEDURE IF EXISTS `sp_seed`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_seed`(
    IN f_num INT UNSIGNED
    )
BEGIN
    DROP TABLE IF EXISTS tmp_seed;
    CREATE TEMPORARY TABLE tmp_seed (id INT);
BEGIN
  DECLARE INT;
  SET i = 1;
  WHILE i <= f_num DO
    INSERT INTO tmp_seed VALUES (i);
    SET i = i + 1;
  END WHILE;
END;
    END$$
DELIMITER ;
生成20个种子库
ytt[love]>call sp_seed(20);
Query OK, 1 row affected (0.15 sec)
现在利用刚才的种子库以及SESSION 变量来实现。
ytt[love]>insert into test_series select @a := @a + 1 as seq, date_sub(current_date(), interval @a dayfrom tmp_seed,(select @a:=0) as seq;
Query OK, 20 rows affected (0.02 sec)
Records: 20  Duplicates: 0  Warnings: 0
ytt[love]>select from test_series;
+----+------------+
| id | log_date   |
+----+------------+
|  1 | 2014-03-02 |
|  2 | 2014-03-01 |
|  3 | 2014-02-28 |
|  4 | 2014-02-27 |
|  5 | 2014-02-26 |
|  6 | 2014-02-25 |
|  7 | 2014-02-24 |
|  8 | 2014-02-23 |
|  9 | 2014-02-22 |
| 10 | 2014-02-21 |
| 11 | 2014-02-20 |
| 12 | 2014-02-19 |
| 13 | 2014-02-18 |
| 14 | 2014-02-17 |
| 15 | 2014-02-16 |
| 16 | 2014-02-15 |
| 17 | 2014-02-14 |
| 18 | 2014-02-13 |
| 19 | 2014-02-12 |
| 20 | 2014-02-11 |
+----+------------+
20 rows in set (0.00 sec)

第二:

MySQL(MariaDB ) 提供了一个序列引擎,可以有这样的功能。

由于MySQL 没有表函数功能,所以如果要造多个字段的数据,就得用JOIN来实现了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
Query OK, 20 rows affected (0.07 sec)
Records: 20  Duplicates: 0  Warnings: 0
ytt[love]>select from test_series;
+----+------------+
| id | log_date   |
+----+------------+
|  1 | 2014-03-02 |
|  2 | 2014-03-01 |
|  3 | 2014-02-28 |
|  4 | 2014-02-27 |
|  5 | 2014-02-26 |
|  6 | 2014-02-25 |
|  7 | 2014-02-24 |
|  8 | 2014-02-23 |
|  9 | 2014-02-22 |
| 10 | 2014-02-21 |
| 11 | 2014-02-20 |
| 12 | 2014-02-19 |
| 13 | 2014-02-18 |
| 14 | 2014-02-17 |
| 15 | 2014-02-16 |
| 16 | 2014-02-15 |
| 17 | 2014-02-14 |
| 18 | 2014-02-13 |
| 19 | 2014-02-12 |
| 20 | 2014-02-11 |
+----+------------+
20 rows in set (0.00 sec)

本文转自 david_yeung 51CTO博客,原文链接:http://blog.51cto.com/yueliangdao0608/1369057,如需转载请自行联系原作者

【原创】MySQL 模拟PostgreSQL generate_series 表函数相关推荐

  1. mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数

    PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression. MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? ...

  2. mysql反三角函数,PostgreSQL中的函数之数学函数(正弦函数、反正弦函数、余弦函数、反余弦函数)...

    在PostgreSQL的数学函数中,也包括了几个三角函数:正弦函数.反正弦函数.余弦函数.反余弦函数. 1. 正弦函数:SIN(x) SIN(x) SIN(x)会返回x的正弦值,x为弧度. 例如,使用 ...

  3. oracle sql now函数,SQL Server,MySQL,Oracle,PostgreSQL中常用函数用法(1)日

    练习使用Hibernate没有用MySQL数据库,而是用了前不久接触的PostgreSQL,由于不同的数据对于相同的操作有各自的函数,MySQL的date_format(),在PostgreSQL中是 ...

  4. postgresql导入mysql_【原创】MySQL和PostgreSQL 导入数据对比

    在虚拟机上测评了下MySQL 和 PostgreSQL 的各种LOAD FILE方式以及时间. 因为是虚拟机上的测评,所以时间只做参考,不要太较真, 看看就好了. MySQL 工具: 1. 自带mys ...

  5. PostgreSQL定义返回表函数

    PostgreSQL定义返回表函数 本文我们学习如何在PostgreSQL 开发返回表函数. 示例数据表 我们使用的示例数据库表为film,如下图所示: 示例1 第一个函数发挥所有满足条件film表记 ...

  6. 【原创】VBA学习笔记(300)VBA 很多工作表函数都只对1维数组有用,用2维数组上经常报错!

    1 VBA 很多工作表函数,都只对一维数组有用,用2维数组上经常报错 很多工作表函数都不能对二维数组生效 有时候连错误值都不返回,直接代码中断) 2 举例1:join() 和 split() 函数 只 ...

  7. MySQL 和 PostgreSQL 对比

    最近打算研究下几个开源的数据库,但是主要精力还是研究Oracle RDBMS. MySQL 和PostgreSQL 是开源中用的最多的2个. 从网上搜了点资料. 整理如下. 这些资料也是以前的资料, ...

  8. mysql longtext db2_从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C

    从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C 用三个简单步骤迁移到 DB2 Vikram Khatri, Nora Sokolof, 和 Manas Dadarkar ...

  9. 在MySQL和PostgreSQL之外,为什么阿里要研发HybridDB数据库?

    编者按 \\ 在大数据火遍IT界之前,大家对数据信息的挖掘通常聚焦在BI(Business Intelligence)之上.BI具有着明确的分析需求,清晰地知道需要处理哪些信息,并且如何最终获得多维度 ...

  10. MySQL和PostgreSQL数据库安全配置

    shewey · 2016/05/26 16:40 0x00 MySQL和PostgreSQL安全配置 针对开源数据库MySQL和PostgreSQL的安全配置主要主要通过身份鉴别.访问控制.安全审计 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(七)-ROS介绍和Turtlesim包的使用
  2. linux使用vim浏览python源码
  3. Linux日志系统-03:logrotate主配置文件详解
  4. java格式_JAVA语言格式
  5. 我那么拼命,为什么还会被裁掉?
  6. emWin智能家居主界面设计,含uCOS-III和FreeRTOS两个版本
  7. padding三个值含义
  8. ES索引管理工具curator安装
  9. iOS开发之更改状态栏字体颜色
  10. 如何解决生活中的那些“不爽”和“意外”
  11. matlab元胞数组
  12. 十九种Elasticsearch字符串搜索方式终极介绍
  13. linux下route未找到命令
  14. Java查询Mysql数据库时区问题(相差13/14)个小时
  15. grpc系列1-K8S集群,VIP,grpc._channel._InactiveRpcError connection reset by peer解决方案 Paddleserving服务化部署
  16. 计算机网络微课笔记03
  17. javaScript中值传递和引用传递
  18. 12312312312332
  19. 资产管理之RFID资产管理系统解决方案-RFID资产智能盘点-新导智能
  20. L2-3 小A爱旅游 (25 分)

热门文章

  1. flex 平铺布局_Flex布局的个人见解~阮一峰的网络日志
  2. python生产和消费模型_【Python】python 生产/消费模型
  3. CSS3最常用选择器总结笔记
  4. CheerpJ相当于一个容器,效果类似Applet
  5. 写博文有助于提高编程能力,因为写文章比写代码难多了
  6. 使用TortoiseGit提交代码到github上
  7. 由电梯紧急按钮,谈用户体验
  8. VirtualBox虚拟机移到另外一台机器,需要在设置中禁用usb
  9. SmartSVN报错format的解决办法
  10. 广义相对论场方程的发现是必然的