视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL实现类似Oracle序列的方案
2020-11-09 21:16:46 责编:小采
文档


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

总结

下载本文
显示全文
专题