小功能--mysql定义序列

我们时常使用序列(Sequence)来处理主键字段,在MySQL中是没有序列的,但是MySQL有提供了自增长(increment)来实现类似的目的。
差异:
(1)首先mysql本身不提供序列机制。
(2)mysql的AUTO_INCREMENT只能实现自增,且步长是1。而sequence可以实现设置步长、开始索引、是否循环等。.
(3)mysql一个表只能有一个自增长字段。自增长只能被分配给固定表的固定的某一字段,不能被多个表共用。并且只能是数字型。
(4)在历史表和数据迁移时,经常会遇到自增主键重复的问题。
场景
在下列情况下可能你需要使用序列:
(1)业务复杂,你需要高度定制和控制主键(自增主键只能是按数字递增的,但是序列可以随心所欲的变化,比如按照年月日生成主键)
(2)你希望手工维护自增长,方便数据迁移;
(3)当事务跨多表时,期望事务可靠性;
然而,序列也有缺点,主要就是程序处理麻烦,不如自增方便。oracle的自增有缓存,不用担心效率问题。
MySQL本身是实现不了的,但我们可以用创建一个序列表,使用函数来获取序列的值。(而mysql只能通过触发器模拟,可能会有性能损失。 )

1.首先创建一张序列表

drop table if exists sequence;
create table sequence(
    merchant_id varchar(50) not null,
    merchant_id varchar(50) not null,
    current_val int(5) default 0,
    incrent_val int(5) default 1,
primary key(merchant_id));

2.新增两个序列

insert into sequence values ('11','test11',0,1);
insert into sequence values ('1','test1',0,1);

3.创建获取当前值函数

create function currval(v_merchant_id varchar(50))
returns integer
begin
    declare i integer;
    set i = 0;
    select current_val into i from sequence where merchant_id = v_merchant_id;
    return i;
end;

4.创建获取、生成下一个值函数

create function nextval (v_merchant_id VARCHAR(50))  
    returns integer  
begin  
    update sequence set current_val = current_val + incrent_val  where merchant_id = v_merchant_id;  
    return currval(v_merchant_id);  
end; 

5.创建触发器。实现在插入数据时,根据merchant_id不同,插入不同的序列值

CREATE TRIGGER `merchant_sequence` BEFORE INSERT ON `nl_loaninfo` FOR EACH ROW 
BEGIN  
set NEW.crt_tst_no = nextval(NEW.merchant_id);  
END;

6.向nl_loaninfo插入数据

insert into nl_loaninfo(merchant_id) values ('11');
insert into nl_loaninfo(merchant_id) values ('11');
insert into nl_loaninfo(merchant_id) values ('11');
insert into nl_loaninfo(merchant_id) values ('1');
insert into nl_loaninfo(merchant_id) values ('1');
SELECT * from nl_loaninfo;

7.select crt_tst_no,merchant_id from nl_loaninfo显示

1   11
2   11
3   11
1   1
2   1

你可能感兴趣的:(Java常用小功能,mysql,sequence,序列)