MySQL实现类似Oracle的序列 - sequence

来源:互联网 发布:照片设计发型软件 编辑:程序博客网 时间:2024/06/01 10:17

1. 介绍

想要将不能自增的类型作为主键,或者想要自定义主键增长规则,这在MySQL是没有原生支持的

但是想要模拟实现一个其实并不复杂,思路如下:

首先,定义一张表sequence,每一行记录就可以作为一个序列,然后在字段上定义当前值、自增规则;
接着,定义一个next函数,用来获取下一个可用的自增主键

2. 实现

总体结构图:

这里写图片描述

  1. 建立sequence table

    drop table if exists cm_sequence;/*==============================================================*//* Table: cm_sequence                                           *//*==============================================================*/create table cm_sequence(name                 varchar(50) not null comment '序列的名字,唯一',current_value        bigint not null comment '当前的值',increment_value      int not null default 1 comment '步长,默认为1',primary key (name));alter table cm_sequence comment '公共的序列表,用于为非自增且要求唯一的字段记录和获取唯一ID。';
  2. 三个函数

    1. func_currval:获取当前序列的值并返回

      drop function if exists func_currval;create function func_currval (seq_name varchar(50))RETURNS integerbegin declare value integer; set value = 0; select current_value into value from cm_sequence where name = seq_name; return value;end;
    2. func_setval:设置当前序列的值并返回

      drop function if exists func_setval;create function func_setval (seq_name varchar(50),value integer) RETURNS integerbegin update cm_sequence set current_value = value where name = seq_name; return func_currval(seq_name);end;
    3. func_nextval:获取序列中的一个可用的值

      drop function if exists func_nextval;create function func_nextval (seq_name varchar(50))RETURNS integercontains sqlbegin update cm_sequence set current_value = current_value + increment_value where name = seq_name; return func_currval(seq_name);end;
  3. 调用

    SELECT func_nextval('xxx');
0 0
原创粉丝点击