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;
函数使用为: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);
同理,可以增加对步长操作的函数,在此不再叙述。
注意语法,数据库字段要对应上
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提供了一种自动增加记录ID的机制。这可以用于许多目的,但是我需要能够使用ORACLE提供的序列。显然,为此目的创建表是没有意义的。 解决方案应该很简单: 1)创建一个表以托管所有需要的序列, 2)创建一个增加特定序列的值并返回新值的函数, 3)创建一个返回序列当前值的函数。 从理论上讲,它看起来很简单…但是… 当增加一个序列的值时(与Oracle中的相同),您需要阻止其他会话
本文向大家介绍mysql类似oracle rownum写法实例详解,包括了mysql类似oracle rownum写法实例详解的使用技巧和注意事项,需要的朋友参考一下 rownum是oracle才有的写法,rownum在oracle中可以用于取第一条数据,或者批量写数据时限定批量写的数量等 mysql取第一条数据写法 oracle取第一条数据写法 ok,上面是mysql和oracle取第一条数据的
本文向大家介绍oracle列合并的实现方法,包括了oracle列合并的实现方法的使用技巧和注意事项,需要的朋友参考一下 很多场合我们都会用到oracle的列合并,oracle提供了如下一些方法用来实现列合并: 一、Oracle 10G以前使用WMSYS.WM_CONCAT: wmsys.wm_concat将字段的值用","来隔开。 二、使用sys_connect_by_path sys_conne
本文向大家介绍SqlServer实现类似Oracle的before触发器示例,包括了SqlServer实现类似Oracle的before触发器示例的使用技巧和注意事项,需要的朋友参考一下 1. 插入数据前判断数据是否存在 2. 删除表中数据时需要先删除外键表的数据
本文向大家介绍MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程,包括了MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程的使用技巧和注意事项,需要的朋友参考一下 最近有个特别变态的业务需求,有一张表 大概就是这样,有300多万行记录,每个pid记录的这个ID的最顶级分类,tid是它的上级分类! 现在需求是:通过指定一个ID,查找
本文向大家介绍在MongoDB上实现类似于MySQL Union的查询?,包括了在MongoDB上实现类似于MySQL Union的查询?的使用技巧和注意事项,需要的朋友参考一下 对于类似于UNION两个集合的查询,请在MongoDB中将JOIN与一起使用。让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用文档创建第二个集合的查询- 在方法的帮助下