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

MySQL实现类似Oracle的序列的更多相关文章

  1. mysql添加类似oracle的伪列及查看表信息

    sql格式: AS rownum, table_name.* ) r, table_name; AS rownum, table_name.字段1, table_name.字段2, table_nam ...

  2. MySQL实现类似Oracle中的nextval和currval

    CREATE TABLE `sequence` ( `seq_name` varchar(50) NOT NULL, `current_val` int(11) NOT NULL, `incremen ...

  3. mysql 实现类似Oracle 或 db2 sequence

    第一步:创建一个索引管理表,其中包含,索引名称.最小值.最大值.当前值.增量,并设置主键为索引名称. CREATE TABLE TB_SEQUENCE ( SEQ_NAME VARCHAR(50) N ...

  4. mysql定时脚本(event),类似oracle的job

    mysql定时脚本(event),类似oracle的job   我有2张表:tb_push_data 和 tb_push_data_log 现在需要每隔一段时间将tb_push_data 符合条件的 ...

  5. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK

    原文地址:http://it.dataguru.cn/article-3352-1.html 摘要: 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来 ...

  6. Mysql使用event,类似oracle job

    MySQL从5.1开始支持event功能,类似oracle的job功能.有了这个功能之后我们就可以让MySQL自动的执行数据汇总等功能,不用像以前需要操作的支持了.如linux crontab功能. ...

  7. MySQL FEDERATED引擎使用示例, 类似Oracle DBLINK(转)

    1 引擎说明 本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的 数据库链接(DBLINK). 要允许这个存储引擎, 当 ...

  8. 用mysql实现类似于oracle dblink的功能

      用mysql实现类似于oracle dblink的功能 首先看看有没有federated 引擎. mysql> show engines; +------------+----------+ ...

  9. 将数据从MySQL迁移到Oracle的注意事项

    将数据从MySQL迁移到Oracle的注意事项1.自动增长的数据类型处理MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值.ORACLE没有自动增长的数据类型,需要建立一个自动 ...

随机推荐

  1. 股市T+0技巧

    虽然现在股票不能t+0交易了,不过通过股票t+0技巧可以变相的实现t+0交易,尤其在主力方面应用股票t+0技巧更为明显.主力资金一旦介入某股,肯定会建立很大的仓位作为主仓,然后长线持有.然而为了推动股 ...

  2. IIS7.5 HTTP错误403.1-Forbidden 您尝试从某个目录运行CGI、ISAPI或其他可执行程序,但该目录不允许运行可执行文件

    ----------------错误详细---------------------------------------------------------------- --------------- ...

  3. paip.性能跟踪profile原理与架构与本质-- python扫带java php

    paip.性能跟踪profile原理与架构与本质-- python扫带java php ##背景 弄个个输入法音标转换atiEnPH工具,老是python性能不的上K,7k记录浏览过k要30分钟了. ...

  4. This in JavaScript

    声明 本文仅为读书笔记并致力于理解Js中的this关键字.如有雷同,纯属巧合.原因有二,其一:有幸看了同一本书,其二:this这玩意已被说烂了~ 为什么要用this? this提供了优雅的方式隐式传递 ...

  5. [推荐]DDOS攻击与防范知识介绍

    [推荐]DDOS攻击与防范知识介绍 DDOS攻防体系建设v0.2(淘宝-林晓曦)     http://wenku.baidu.com/view/39549a11a8114431b90dd866.ht ...

  6. struts2从2.2.3升级到2.3.15.1步骤

    1. 删除以下jar包 asm-3.1.jar asm-commons-3.1.jar commons-beanutils-1.7.0.jar commons-fileupload-1.2.2.jar ...

  7. com.android.org.bouncycastle.jce.exception.ExtCertPathValidatorException: Could not validate certificate: current time:

    http://www.cnblogs.com/mayongsheng/p/4387109.html https://github.com/awslabs/aws-sdk-android-samples ...

  8. 在Flex (Flash)中嵌入HTML 代码或页面—Flex IFrame

    在flex组件中嵌入html代码,可以利用flex iframe.这个在很多时候会用到的,有时候flex必须得这样做,如果你不这样做还真不行-- flex而且可以和html进行JavaScript交互 ...

  9. 无线局域网络 WIFI/WAPI/WLAN区别浅析

    WIFI和WAPI的区别 既然WIFI和WAPI都是WLAN的传输协议,那么两者究竟都有怎样的区别? 首先第一点区别在于,两者的缔造者不一样.WIFI是又国外制定的一个协议,而WAPI是由中国制定的, ...

  10. OGG-01232 Receive TCP params error: TCP/IP error 104 (Connection reset by peer), endpoint:

    源端: 2015-02-05 17:45:49 INFO OGG-01815 Virtual Memory Facilities for: COM anon alloc: mmap(MAP_ANON) ...