加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中如何实现类似Oracle的序列

发布时间:2016-10-02 21:07:57 所属栏目:MySql教程 来源:站长网
导读:Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、是否循环等;若需要迁移数据库,则对于主键这块,也是个头大的问题。 本

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;

本栏目更多精彩内容:http://www.bianceng.cn/database/MySQL/

函数使用为: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);

同理,可以增加对步长操作的函数,在此不再叙述。

以上代码未经测试,仅仅是想表达一个想法而已。

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读