MySQL实现相似Oracle的序列

MySQL实现相似Oracle的序列
2013-10-22 10:33:35      我来讲两句       做者:走过的足迹
收藏    我要投稿
MySQL实现相似Oracle的序列
 
Oracle通常使用序列(Sequence)来处理主键字段,而MySQL则提供了自增加(increment)来实现相似的目的;
但在实际使用过程当中发现,MySQL的自增加有诸多的弊端:不能控制步长、开始索引、是否循环等;若须要迁移 数据库,则对于主键这块,也是个头大的问题。
本文记录了一个模拟 Oracle序列的方案,重点是想法,代码其次。
Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是:一、MySQL中新建表,用于存储序列名称和值;二、建立函数,用于获取序列表中的值;
具体以下:
表结构为
 
 
[sql] 
表结构为:  
?
1
2
3
4
5
6
7
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)  
);

 

实现currval的模拟方案
 
?
1
2
3
4
5
6
7
8
9
10
11
[sql] 
create function currval(v_seq_name VARCHAR (50))  
returns integer  
begin  
     declare value integer ;  
     set value = 0;  
     select current_value into value  
     from sequence  
     where seq_name = v_seq_name;  
     return value;  
end ;

 

[sql] 
函数使用为:select currval('MovieSeq');  
 
 
实现nextval的模拟方案
?
1
2
3
4
5
6
7
8
9
[sql] 
create function nextval (v_seq_name VARCHAR (50))  
return integer  
begin  
   update sequence  
   set current_val = current_val + increment_val  
   where seq_name = v_seq_name;  
   return currval(v_seq_name);  
end ;

 

[sql] 
函数使用为:select nextval('MovieSeq');  
 
增长设置值的函数
 
?
1
2
3
4
5
6
7
8
[sql] 
create function setval(v_seq_name VARCHAR (50), v_new_val INTEGER )  
returns integer  
begin  
   update sequence  
   set current_val = v_new_val  
   where seq_name = v_seq_name;  
return currval(seq_name);

 

 
同理,能够增长对步长操做的函数,在此再也不叙述。
注意语法,数据库字段要对应上
use bvboms;  DELIMITER $$  create function setval(v_seq_name VARCHAR(50), v_new_val INTEGER)  returns integer  begin    update sequence    set current_val = v_new_val    where seq_name = v_seq_name;  return currval(seq_name); end $$ DELIMITER $$ 
相关文章
相关标签/搜索