日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2025/3/11 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

PostgreSQL 提供了一個(gè)很強(qiáng)大的造數(shù)據(jù)的函數(shù)generate_series,基于Common Table Expression。

MySQL 沒(méi)有復(fù)雜的應(yīng)用程序類型,該如何實(shí)現(xiàn)這樣的功能呢? 我想到的三種方法如下:

1. 用存儲(chǔ)過(guò)程來(lái)做。 缺點(diǎn)是寫(xiě)好多數(shù)據(jù)庫(kù)不擅長(zhǎng)的應(yīng)用邏輯。

2. 我們想到MySQL提供了SESSION 變量這樣的特性, 可以很方便的完成同樣的功能。

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

第一種我就不實(shí)現(xiàn)了, 我來(lái)舉例說(shuō)明后兩種。

表結(jié)構(gòu)如下:

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)

對(duì)應(yīng)的PostgreSQL 運(yùn)算結(jié)果:

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 變量來(lái)變相實(shí)現(xiàn)的話,需要一個(gè)種子庫(kù)。

以下存儲(chǔ)過(guò)程生成種子庫(kù)。

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個(gè)種子庫(kù)

ytt[love]>call sp_seed(20);

Query OK, 1 row affected (0.15 sec)

現(xiàn)在利用剛才的種子庫(kù)以及SESSION 變量來(lái)實(shí)現(xiàn)。

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 ) 提供了一個(gè)序列引擎,可以有這樣的功能。

由于MySQL 沒(méi)有表函數(shù)功能,所以如果要造多個(gè)字段的數(shù)據(jù),就得用JOIN來(lái)實(shí)現(xiàn)了。

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)

總結(jié)

以上是生活随笔為你收集整理的mysql 模拟序列_【原创】MySQL 模拟PostgreSQL generate_series 表函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。