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');

你可能感兴趣的:(8/12,Data,Structrue,7/12,Database)