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);

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

时间: 2024-11-10 14:07:52

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

MySQL实现类似Oracle序列的函数

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) ); drop function if exists currval; create function currval(v_seq_name VARCHA

mysql中类似oracle的over分组实现

今天,看到别人问问题,需求大概是这样的. id s 开始时间 结束时间 1 20 2001-01-01 08:10:20 2001-01-01 08:10:40 1 9 2001-01-01 08:10:41 2001-01-01 08:10:50 1 60 2001-01-01 08:10:51 2001-01-01 08:11:51 1 2 2001-01-01 08:12:51 2001-01-01 08:12:53 2 51 2001-01-01 08:10:00 2001-01-01

mysql实现类似oracle的connect by功能

1.生成测试表与数据:create table mytest (  id int primary key,  nodename varchar(20),  pid int );insert into mytest (id,nodename,pid)values(  1 ,'A', 0);insert into mytest (id,nodename,pid)values(  2 ,'B', 1);insert into mytest (id,nodename,pid)values(  3 ,'C

oracle 重置序列从指定数字开始的方法详解

原文 oracle 重置序列从指定数字开始的方法详解 重置oracle序列从指定数字开始 declare n number(10); v_startnum number(10):=10000001;--从多少开始 v_step number(10):=1;--步进 tsql varchar2(200); v_seqname varchar2(200):='MIP_JF_SEQUENCE';--序列名 begin execute immediate 'select '||v_seqname||'.

Oracle的序列

Oracle的序列 序列介绍 序列是Oracle提供的用于产生一系列唯一数字的数据库对象.使用序列可以实现自动产生主键值.序列也可以在许多用户并发环境中使用,为所有用户生成不重复的顺序数字,而且不需要任何额外的I/O开销. 与视图一样,序列并不占用实际的存储空间,只是在数据字典中保存它的定义信息.用户要在自己的模式中创建序列,必须具有CREATE SEQUECNCE系统权限,如果要在其他模式中创建序列,则必须具有CREATE ANY SEQUENCE系统权限. 创建序列的语法如下: CREATE

迁移mysql数据到oracle上

转自:http://www.cnblogs.com/Warmsunshine/p/4651283.html 我是生成的文件里面的master.sql里面的sql,一个一个拷出来的. 迁移mysql数据到oracle上 一.   服务器本地安装Oracle11G或10G 二.   在运行中输入sqlplus /nolog,oracle中创建表空间. 三.   安装完成后在运行中输入 sql developer打开sql developer (就是本机自带的) 四.   选择jdk版路径(jdk版本

Oracle中序列的操作以及使用前对序列的初始化

Oracle中序列的操作以及使用前对序列的初始化 一 创建序列 create sequence myseq start with 1 increment by 1 nomaxvalue minvalue 1 二 初始化序列 select myseq.nextval from dual; 这里值得注意的是,如果先直接写select myseq.currval from dual,会提示会提示myseq.currtval尚未在此会话中定义. www.2cto.com 三 使用序列 初始化序列之后才可

Oracle修改序列(Sequence)起始值的方法

Oracle修改序列(Sequence)起始值的方法 Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改:alter sequence sequencename start with xxxxxxxx.但是,在Oracle DB中,修改序列没有这样的语法.下面介绍几种修改方式: 1.先删除序列,然后重新创建.不过这不是当前要讲的重点.这个方法比较暴

MySQL相似于oracle的to_char() to_date()方法1

原文地址:mysql相似于oracle的to_char() to_date()方法作者:Michael mysql日期和字符相互转换方法 date_format(date,'%Y-%m-%d')    -------------->oracle中的to_char(); str_to_date(date,'%Y-%m-%d')     -------------->oracle中的to_date(); %Y:代表4位的年份 %y:代表2为的年份 %m:代表月, 格式为(01……12) %c:代表