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;

本栏目更多精彩内容: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);

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 函数
, 序列
, oracle 序列
, sequence
varchar
mysql实现oracle序列、mysql实现序列、mysql实现序列递增、oracle 序列、oracle创建序列,以便于您获取更多的相关知识。

时间: 2024-12-02 21:51:01

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

在MySQL中创建实现自增的序列(Sequence)的教程_Mysql

项目应用中,曾有以下一个场景: 接口中要求发送一个int类型的流水号,由于多线程模式,如果用时间戳,可能会有重复的情况(当然概率很小). 所以想到了利用一个独立的自增的sequence来解决该问题. 当前数据库为:mysql 由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下: 第一步:创建--Sequence 管理表 DROP TABLE IF EXISTS sequence; CREATE TABLE

把oracle数据库中的表写到mysql中

问题描述 把oracle数据库中的表写到mysql中 如题,oracle数据库中的表格,完完全全的导入到mysql数据库中,有没有什么简单的方法,不要写程序之类的.有没有大神知道?望指教. 解决方案 移植oracle数据库表结构到mysql数据库分页,Oracle 和 mysql 解决方案二: 这好像有点难吧?有些字段类型名称都不一样 解决方案三: robot已经告诉你了,数据库之间的类型啥的都不一样,不可能完全导入,必须做一些转换才行.

MySQL中实现插入或更新操作(类似Oracle的merge语句)_Mysql

如果需要在MySQL中实现记录不存在则insert,不存在则update操作.可以使用以下语句: 更新一个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA) 更新多个字段: INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KE

通过oracle类比MySQL中的字节字符问题

在几个月前写过一篇博文 MySQL数据类型 http://blog.itpub.net/23718752/viewspace-1371434/  当时写完以后有同事朋友就提出了一些疑问,对于汉字在MySQL和Oracle中的存放情况希望我能够详细的说说.  关于MySQL中的varchar字符类型,自己的操作都是基于字符集UTF-8.  对于存放汉字,涉及到字符,字节,编码的一些知识,我查了一下,自己先补补,发现有一个帖子已经描述的很详细了.直接引用过来.  http://www.regexla

oracle转Mysql中,varchar2(10)和number应该转换为什么类型? (转)

一. varchar2(10)和number应该转换为什么类型? oracle转成mysql时:varchar2(10)可以转成varchar(10)number则要看oracle中存储的具体是什么类型的数据:1.如果是整型,那么mysql中,用int即可:2.如果是带小数位的,那么mysql中可用numeric类型. 注:mysql中没有varchar2(10)和number这两个数据类型   二. Mysql varchar VS Oracle varchar2 mysql和oracle做数

oracle中的clob在mysql中的移植

问题描述 oracle中的clob在mysql中的移植 oracle中的clob一般会在mysql移植成什么数据类型,empty_clob()又会用什么代替呢?跪求 解决方案 数据库移植: 从Oracle移植到MySQL 注意databasePlatformOracle移植到mysql注意事项oracle移植到mysql注意事项 解决方案二: 数据库移植: 从Oracle移植到MySQL 注意databasePlatform Oracle移植到mysql注意事项 oracle移植到mysql注意

在MySQL中使用序列的简单教程_Mysql

序列是一组整数1,2,3,...中生成的顺序.序列中经常使用的数据库,因为很多应用都需要一个表中的每一行包含一个独特的值和序列提供了一个简单的方法来产生.本章介绍如何使用MySQL中的序列.使用自动递增列: 在MySQL中使用序列最简单的方法是定义一个AUTO_INCREMENT列,剩下的事情留给MySQL处理. 实例: 试试下面的例子.这将创建表之后,它会在此表中它不是必需的记录ID插入几行,因为它由MySQL自动递增. mysql> CREATE TABLE insect -> ( -&g

Oracle使用触发器和mysql中使用触发器的案例比较_oracle

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法

ssh框架中如何为oracle中对应的表创建hibernate序列,以达到新加主键自增的功能

问题描述 ssh框架中如何为oracle中对应的表创建hibernate序列,以达到新加主键自增的功能 解决方案 .hbm 文件 <id name="id" type="java.lang.String"> <column name="ID" length="32" /> <generator class="uuid.hex" /> </id>策略不一样<