MySQL实现类似Oracle的序列

MySQL实现类似Oracle的序列
 
Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的;
但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等;若需要迁移 数据库,则对于主键这块,也是个头大的问题。
本文记录了一个模拟 Oracle序列的方案,重点是想法,代码其次。
Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是:1、MySQL中新建表,用于存储序列名称和值;2、创建函数,用于获取序列表中的值;
具体如下:
表结构为
 
 
[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 $$ 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值