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
  • 1434

ORACLE中创建自增序列sequence

先假设有这么一个表: create table S_Depart  (    DepartId             INT                             no...

oracle如何实现自增?----用序列sequence的方法来实现

出处:http://blog.csdn.net/hu_shengyang/article/details/6266433 将表t_user的字段ID设置为自增:(用序列sequence的方法...

Orcle 主键自增(序列sequence、触发器trigger、主键primary)

设置主键: 1、建表时指定primary key: create table test(id number(6) primary key, name varchar2(20) ); 2、如果表已...

Orcle 主键自增(序列sequence、触发器trigger、主键primary)

设置主键: 1、建表时指定primary key: create table test(id number(6) primary key, name varchar2(20) ); 2、如果表已...

Oracle使用sequence(序列)+tirgger(触发器)实现auto_increment(主键自增)

受mysql的影响,在oracle建表的时候差点就控制不住自己的麒麟臂打下auto_increment。不过Oracle提供了一套机制也可以实现自增主键,虽然稍微麻烦点也算是殊途同归。 数据准备-测试...

Oracle中的序列(sequence、自增字段)

--1、创建序列create sequence seq_test increment by 1 -- 每次加几个 start with 1 -- 从1开始计数 nomaxvalue ...

CREATE SEQUENCE添加自增序列及NEXT VALUE FOR返回序列号

From :https://msdn.microsoft.com/zh-cn/library/ff878091.aspx 语法: CREATE SEQUENCE [schema_nam...

Oracle使用序列创建自增字段

  • 2012年08月15日 16:43
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql 中创建自增的序列(Sequence)
举报原因:
原因补充:

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