您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页MySQL实现类似Oracle序列的方案

MySQL实现类似Oracle序列的方案

来源:华拓科技网


MySQL实现类似Oracle的序列

Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的;

但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等;若需要迁移数据库,则对于主键这块,也是个头大的问题。

本文记录了一个模拟Oracle序列的方案,重点是想法,代码其次。

Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是:

1、MySQL中新建表,用于存储序列名称和值;

2、创建函数,用于获取序列表中的值;

具体如下:

表结构为: 

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的模拟方案

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;

函数使用为:select currval('MovieSeq'); 

实现nextval的模拟方案

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;

函数使用为:select nextval('MovieSeq');  

增加设置值的函数

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 $$

总结

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务