MySQL/Sequence

维基教科书,自由的教学读本

MySQL中没有实现序列,但MySQL提供了自增(increment)字段。自增不能设置步长、开始索引、是否循环等;一张表只能有一个自增字段,有时需要单表多字段分别自增。为此,模仿Oracle实现自增:

新建序列表作为元数据:

drop table if exists sequence;   
create table sequence (       
 seq_name    VARCHAR(50)  NOT NULL,    -- 序列名称       
 current_val     INT         NOT NULL,             -- 当前值       
 increment_val   INT         NOT NULL    DEFAULT 1, -- 步长(跨度)       
 PRIMARY KEY (seq_name));

新增一个序列的定义:

INSERT INTO sequence VALUES ('seq_test', '0', '1');

创建currval函数,用于获取给定序列的当前值:

delimiter //  
create function currval(v_seq_name VARCHAR(50))   
returns integer(11) 
begin
 declare value integer;
 set value = 0;
 select current_val into value from sequence where seq_name = v_seq_name;
   return value;
end;
//
delimiter ;

创建nextval函数,用于获取给定序列的下一个新值:

create function nextval (v_seq_name VARCHAR(50)) returns integer(11) 
begin
    update sequence set current_val = current_val + increment_val  where seq_name = v_seq_name;
    return currval(v_seq_name);
end;