mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数
PostgreSQL 提供了一个很强大的造数据的函数generate_series,基于Common Table Expression。
MySQL 没有复杂的应用程序类型,该如何实现这样的功能呢? 我想到的三种方法如下:
1. 用存储过程来做。 缺点是写好多数据库不擅长的应用逻辑。
2. 我们想到MySQL提供了SESSION 变量这样的特性, 可以很方便的完成同样的功能。
3. MariaDB 提供了一种sequence 引擎,也可以方便的做这件事情。
第一种我就不实现了, 我来举例说明后两种。
表结构如下:
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 变量来变相实现的话,需要一个种子库。
以下存储过程生成种子库。
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 i 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 day) from 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来实现了。
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)
mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数相关推荐
- MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...
- mysql硬盘备份_原创-在mysql中把里面的数据库备份到自己的硬盘上
原创-在mysql中把里面的数据库备份到自己的硬盘上 (2011-04-15 20:33:23) 标签: 千百度女鞋 杂谈 在mysql中把内中的数值库备份到本人的硬盘上在数值库表拾失或许破坏的情况下 ...
- 删除 mysql ibd文件_误删除MySQL数据库表的ibd文件怎么办
很多年前,学习oracle10g的技术时,看过盖国强老师写的一篇文章,在linux系统中,oracle数据库存活的时候,用系统命令rm删除一个数据文件,这个时候找到删除文件的fd文件句柄,就可以将删除 ...
- php mysql emoji表情_让MySQL支持Emoji表情
让MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集.utf8mb4和utf8到底有什么区别呢?原来以往的 让MySQL支持Emoji表情,涉及无线 ...
- mysql核心数据库_从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程...
从MySQL基础进军MySQL核心架构 178集MySQL数据库核心基础视频教程 MySQL基础案例教程 课程目录 (1) 01MySQL基础_课程引入.avi (2) 02MySQL基础_为什么学习 ...
- php mysql 内存溢出_关于MySQL的整型数据的内存溢出问题的应对方法_MySQL
今天接到一个朋友电话说是觉的数据库被别人更改了,出现数据不对的问题 .经过很久的排查是数据类型溢出了(发生问题的版本是MySQL 5.1).后来通过给朋友那边把MySQL 5.1升级到MySQL 5. ...
- mysql emoji表情_让MySQL支持Emoji表情 mysql 5.6
最近在做微信相关的项目,其中MySQL 要存储emoji表情,因此发现我们常用的utf8 字符集根本无法存储表情.网上有不少替代方案.本人还是采用了修改MySQL字符集的方案简单快捷. 首先将我们数据 ...
- php配置mysql集群_【mysql集群】mysql集群配置
http://topic.csdn.net/u/20100621/16/c9436c17-374c-4c3a-b075-a18670143fd1.html MySql-Cluster安装 系统 cen ...
- mysql 二进制分发版_安置MySQL二进制代码分发
作者:天极软件 泉源:天极软件 你必要下列工具安置一个MySQL二进制分发:GNU gunzip解紧缩分发. 一个恰当的tar解包分发. GNU tar已知可以. 在Linux下的另一个安置要领是运用 ...
最新文章
- python网络信息提取_python网络爬虫与信息提取I
- Yongkil Kwon:EOS具有当今世界上最多中心化的协议 | 独家专访
- SAP C/4HANA到底包含哪些产品?
- vba 邮件body html,Excel VBA中的Outlook电子邮件和签名 – .Body vs .HTMLbody
- VC常用数据类型使用转换详解
- codeforces229 D. Towers(dp+贪心)
- JS加密算法简单分析
- Xtrabackup安装以及应用
- 冬日圣诞节海报还没灵感?看这里!
- Redis简单入门认识
- 常见浏览器兼容性问题与解决方案(CSS)
- C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism
- 目前SolidWorks软件哪个版本比较好用?更稳定一些?
- 十年老码农,现场教你写简历!
- 实现金钱数字格式化:一行代码解决(三位分隔)
- python jupyter notebook怎么调字体大小_配置Jupyter的代码主题 字体以及字体大小 代码自动补全...
- 豆瓣电影数据可视化大屏
- CSDN - 盛洪宇(技术胖) - Vue2.x从入门到实战
- 活动星投票国潮大秀东方网络评选投票怎么做的免费微信投票活动
- 阿里云centos7安装mysql