MySQL实现类似Oracle的序列 - sequence

1. 介绍

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

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

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

2. 实现

总体结构图:

MySQL实现类似Oracle的序列 - sequence_第1张图片

  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 integer begin 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 integer begin 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 integer contains sql begin 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');

你可能感兴趣的:(mysql,序列,sequence)