mysql 中创建自增的序列(Sequence)

需求:

业务开发一个时间轴功能,时间轴上展示多个表的数据,时间轴滚动刷新。

问题:

  1. 获取多个表中的前几条数据比较麻烦,需要将多个表的数据拿出来排序然后limit 取数据。这样多表取数据如果数据量大很麻烦,
    比如要取前5-10条数据,需要取表A的0-10 和表B的0-10然后合并,取前五。这样会搜索出冗余数据。
  2. 多个表按时间排序时间可能重复,所以以时间为分界值截取数据容易造成数据记录丢失。

解决:

分析以上问题,决定让多个表的id 字段取自同一个序列,这样就可以直接用 id 在两个表中搜索排序,业务实现难度大大降低。

当然这样也不是最好解决方案,因为这样搜出来的两个表的数据还是需要合并排序,然后取前几,只是搜索结果比较少,内存中处理的数据量比较小而已。

最好的解决方案就是,在表设计的时候规避这个操作,规避掉多表搜索。把握好面向对象的思想,划分好对象。

mysql 中创建自增的序列(Sequence)

由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能。

1.创建sequence表

CREATE TABLE `sequence` (
  `name` varchar(50) COLLATE utf8_bin NOT NULL COMMENT '序列的名字',
  `current_value` int(11) NOT NULL COMMENT '序列的当前值',
  `increment` int(11) NOT NULL DEFAULT '1' COMMENT '序列的自增值',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

2.创建–取当前值的函数

BEGIN 
     DECLARE value INTEGER; 
     SET value = 0; 
     SELECT current_value INTO value 
          FROM sequence 
          WHERE name = seq_name; 
     RETURN value; 
END

3.创建–取下一个值的函数

DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
     RETURNS INTEGER 
     LANGUAGE SQL 
     DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
BEGIN 
     UPDATE sequence 
          SET current_value = current_value + increment 
          WHERE name = seq_name; 
     RETURN currval(seq_name); 
END 
$ 
DELIMITER ; 

4.创建–更新当前值的函数

DROP FUNCTION IF EXISTS setval; 
DELIMITER $ 
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER) 
     RETURNS INTEGER 
     LANGUAGE SQL 
     DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
BEGIN 
     UPDATE sequence 
          SET current_value = value 
          WHERE name = seq_name; 
     RETURN currval(seq_name); 
END 
$ 
DELIMITER ; 

这里写图片描述

5.测试

执行sql

INSERT INTO sequence VALUES ('testSeq', 0, 1);--添加一个sequence名称和初始值,以及自增幅度

SELECT SETVAL('testSeq', 10);--设置指定sequence的初始值

SELECT CURRVAL('testSeq');--查询指定sequence的当前值

SELECT NEXTVAL('testSeq');--查询指定sequence的下一个值

本文参考自:http://www.jb51.net/article/76124.htm

阅读更多
版权声明:本文为博主编写文章,未经博主允许转载,转载请注明出处。 https://blog.csdn.net/u012373815/article/details/78179411
文章标签: mysql 需求
个人分类: -->7.2 mysql
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭