zoukankan      html  css  js  c++  java
  • MySQL实现类似Oracle的序列

    MySQL实现类似Oracle的序列
    2013-10-22 10:33:35     我来说两句       作者:走过的足迹
    收藏    我要投稿
    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 $$ 
  • 相关阅读:
    人脸旋转 《转》
    深度学习如何入门?<知乎>
    openGL-------------别人的博客
    如何实现视频的快进快退功能(转)
    MFC+OpenGL基础绘制<转>
    野蒜
    人脸识别68个点<转>
    cv::circle《转》
    HTML5 Canvas之猜数字游戏
    LIRe 源代码分析 3:基本接口(ImageSearcher)
  • 原文地址:https://www.cnblogs.com/goto/p/4126498.html
Copyright © 2011-2022 走看看