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

原创 2017年10月09日 09:28:56

需求:

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

问题:

  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

版权声明:本文为博主编写文章,未经博主允许转载,转载请注明出处。

在MySQL中创建实现自增的序列(Sequence)的教程

项目应用中,曾有以下一个场景: 接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小)。 所以想到了利用一个独立的自增的sequence来解决该问题...
  • Angel_G
  • Angel_G
  • 2016年11月12日 09:43
  • 1801

Mysql存储过程(五)——SEQUENCE的实现

在oracle中,sequence提供多表多字段可共用一个不重复值。Mysql中存在自增列,基本可以满足PK的要求。但自增列存在限制:a.只能用于表中的一个字段,一张不能同时存在两个以上的自增列;b....
  • crazylaa
  • crazylaa
  • 2010年03月11日 11:59
  • 10394

Navicat for Mysql 模拟实现oracle sequence

一、问题背景        应用程序需要使用唯一的序列号,而多线程使得采用时间戳的方式生成该序列号的方式不可取(虽然冲突的可能性非常小),但mysql并没有oracle的sequence功能,通过my...
  • pj901104
  • pj901104
  • 2014年12月04日 14:07
  • 1469

MySQL实现序列(Sequence)效果

MySQL实现序列效果   一般使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的,但也只是自增,而不能设置步长...
  • sinat_19351993
  • sinat_19351993
  • 2015年07月31日 15:08
  • 21819

MySQL实现类似Oracle的序列 - sequence

1. 介绍想要将varchar类型的数据作为主键,并要求能按自定义规则自增,这在MySQL是没有原生支持的但是想要模拟实现一个其实并不复杂,思路如下: 首先,定义一张表sequence,每一行记录...
  • u010297957
  • u010297957
  • 2016年04月19日 16:36
  • 3037

mysql 创建sequence

创建mysql sequence,实现table表的主键序列化,序列达到最大值后循环使用
  • yuxiangaaaaa
  • yuxiangaaaaa
  • 2016年12月29日 08:47
  • 5321

DB2序列 自增列 解决之Sequence 对象

我的上两个专栏中已经介绍到了与版本 8 功能相关的主题。我们可能需要在今天设计的数据库和应用程序中考虑这些功能。我们已经谈论了新的数据分区的辅助索引和附加的索引修改。在上一期中,我们了解了 DSSIZ...
  • lqb2008
  • lqb2008
  • 2011年09月14日 00:51
  • 4665

通过PL/SQL创建序列和触发器实现表自增字段

创建序列 创建触发器
  • mypowerhere
  • mypowerhere
  • 2017年06月28日 15:13
  • 2347

db2 sequence使用

--第一种方法(自己使用过的,绿色安全无污染): 创建sequence,名为SEQ_LDBG  ,自增1, CREATE SEQUENCE  SEQ_LDBG  AS ...
  • cws1214
  • cws1214
  • 2014年07月14日 14:28
  • 10610

Trafodion sequence与自增序列

Trafodion中创建SEQUENCE与Oracle类似,基本语法如下,CREATE SEQUENCE seqname {START WITH} {MINVALUE} {MAXVALUE} {INC...
  • Post_Yuan
  • Post_Yuan
  • 2016年11月24日 17:43
  • 534
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql 中创建自增的序列(Sequence)
举报原因:
原因补充:

(最多只允许输入30个字)