mysql本身是没有sequence的但是我可以自己建立sequence存储过程.
首先我们先建立相关的表,和存储过程.
第一步是创建规则表.
drop table if exists `seq`;
create table `seq` (
`id` bigint(11) not null auto_increment,
`name` varchar(255) not null comment 'sequence名称',
`max` bigint(11) not null default '1' comment '最大id',
`length`int(2) not null default '1' comment '生成序列后的长度,以0补全',
`next` int(2) not null default '1' comment '增长的长度',
`rules` varchar(255) default null comment '规则以###max_id###做为替换',
primary key (`id`),
unique key `fk_name` (`name`)
) engine=innodb auto_increment=1 default charset=utf8;
第二步是创建sequence方法.计算方法.
drop function if exists bj;
delimiter $
create function bj (seq_name varchar(50))
returns varchar(20)
contains sql
begin
declare seq_rules varchar(255);
declare seq_length int(2);
declare seq_max bigint(20);
declare max_id_length int(20);
declare max_id varchar(20);
select rules,seq.`length`,`max` into seq_rules, seq_length,seq_max from seq where name = seq_name ;
set max_id = seq_max;
set max_id_length = character_length(max_id);
#长度不够补0
while seq_length > max_id_length do
set max_id = concat('0',max_id);
set max_id_length = character_length(max_id);
end while;
#替换规则
if seq_rules is not null and instr(seq_rules,'###max_id###') > 0 then
set max_id = replace(seq_rules,'###max_id###',max_id);
end if;
return max_id;
end$
delimiter ;
第三步是创建sequence方法.调用方法.
drop function if exists nextval;
delimiter $
create function nextval (seq_name varchar(50))
returns varchar(20)
contains sql
begin
update seq set `max` = `max` + next where name = seq_name;
return bj(seq_name);
end$
delimiter ;
好上边没问题了 我们建立几条测试数据看看。
#纯数字序列
insert into `seq` (`name`,`max`,`length`,`next`,`rules`) values ('seq_test1', '0', '1', '1', null );
#带有规则序列
insert into `seq` (`name`,`max`,`length`,`next`,`rules`) values ('seq_test2', '0', '3', '2','seq###max_id###');
select nextval('seq_test1');
select nextval('seq_test2');