`
dannyhz
  • 浏览: 395611 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mysql 的 序列的实现

 
阅读更多
http://blog.csdn.net/maidou_2011/article/details/7758282

引用


由于mysq只有递增列的概念没有oracle的sequence功能,这样对于以前习惯用oracle数据库开发的程序员不太实用,尤其在要使用nextval在获取增长序列的时候。这样就设计一个能模拟oracle sequence的功能。
  思路:我们可以用一张表来记录sequence数据,其实在使用oracle sequence的时候也类似是一张表,currentval、nextval和增长系数就类似表中的字段。而currentval、nextval我们可以设计成两个function这样在调用的时候返回currentval、nextval的值。

  设计表seqMsql:


[sql] view plain copy
CREATE TABLE seqMysql  
(   
seqname VARCHAR(50) NOT NULL,  --sequence名称 
currentValue INT NOT NULL,  --当前sequence值 
increment INT NOT NULL DEFAULT 1,  --增长系数 
PRIMARY KEY (seqname)   
) ENGINE=InnoDB;   

         实例:插入一个sequence数据
[sql] view plain copy
INSERT INTO seqMysql VALUES ('browserSeq',10002,1); 
         查询:

[sql] view plain copy
+------------+--------------+-----------+ 
| seqname    | currentValue | increment | 
+------------+--------------+-----------+ 
| browserSeq |        10002 |         1 | 
+------------+--------------+-----------+ 
1 row in set 

         获取当前值function:

[sql] view plain copy
DELIMITER $  
CREATE FUNCTION currval (seq_name VARCHAR(50))   
RETURNS INTEGER   
CONTAINS SQL   
BEGIN   
  DECLARE current INTEGER;   
  SET current = 0;   
  SELECT currentValue INTO current   
  FROM seqMysql   
  WHERE seqname = seq_name;   
  RETURN current;   
END$  
DELIMITER ; 

        查询:

[sql] view plain copy
mysql> SELECT currval('browserSeq'); 
+--------------------+ 
| currval('browserSeq')| 
+--------------------+ 
|              10002 | 
+--------------------+ 
1 row in set 

        获取下一个值function:

[sql] view plain copy
DELIMITER $   
CREATE FUNCTION nextval (seq_name VARCHAR(50))   
RETURNS INTEGER   
CONTAINS SQL   
BEGIN   
   UPDATE seqMysql   
   SET currentValue = currentValue + increment   
   WHERE seqname = seq_name;   
   RETURN currval(seq_name);   
END$   
DELIMITER ;  

       查询:

[sql] view plain copy
mysql> SELECT nextval('browserSeq'); 
+-----------------------+ 
| nextval('browserSeq') | 
+-----------------------+ 
|                      10003 | 
+-----------------------+ 
1 row in set 

       设置增长系数function:

[sql] view plain copy
DELIMITER $   
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)   
RETURNS INTEGER   
CONTAINS SQL   
BEGIN   
   UPDATE seqMysql   
   SET currentValue = value   
   WHERE seqname = seq_name;   
   RETURN currval(seq_name);   
END$   
DELIMITER ;   






分享到:
评论

相关推荐

    java通过Mysql实现类似oracle序列功能序列.rar

    在Java应用程序中,如果需要在MySQL环境中实现类似Oracle序列的功能,我们需要自己设计解决方案。以下是一些关键知识点的详细说明: 1. **Java连接MySQL**: - 首先,你需要使用JDBC(Java Database Connectivity...

    mysql实现序列.sql

    mysql实现序列可以与oracle一样有序列的功能

    MySQL 序列 AUTO_INCREMENT详解及实例代码

    MySQL序列是一组整数:1, 2, 3, …,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。 本章我们将介绍如何使用MySQL的序列。 使用AUTO_INCREMENT MySQL中...

    flinkcdc-mysql自定义反序列化器.pdf

    为了实现Flink CDC与MySQL的集成,需要自定义反序列化器,以便正确地处理MySQL的数据。 自定义反序列化器需要实现DebeziumDeserializationSchema接口,负责将SourceRecord转换为自定义的数据格式。在本例中,我们将...

    Mysql(序列/ID)生成方案

    本方案主要探讨如何在MySQL中实现一个可靠的序列/ID生成策略,以满足并发处理的需求。 首先,让我们关注`mysql_sequence.sql`文件。这个SQL脚本通常会包含创建序列的表结构以及相关的操作,例如插入、更新或获取下...

    利用mysql实现的雪花算法案例

    例如,MySQL通过`autoincrement`实现自增,Oracle则使用序列。但这些方法在分表后不再适用,因此需要寻找新的解决方案。 2. 解决方案对比 - 数据库表维护:在特定数据库中维护一个自增ID表,每次需要ID时加锁更新,...

    mysql生成oracle序列

    为了在MySQL中实现类似于Oracle序列的功能,可以通过创建一张特殊的表和几个自定义函数来实现。这种方法可以有效地模拟Oracle序列的行为,并能够根据指定的步长和长度来生成数值。 ##### 2.1 创建模拟序列的表 在...

    MySQL JDBC 客户端反序列化漏洞分析 - 安全客,安全资讯平台2

    `queryInterceptors`参数则指定了一个实现了`com.mysql.cj.interceptors.QueryInterceptor`接口的类列表,这些类会在查询执行前或后插入操作。在这种情况下,`ServerStatusDiffInterceptor`被用作拦截器,其`...

    Flinkcdc监测mysql数据库,自定义反序列化,利用flinkApi和flinkSql两种方式

    在这个场景下,我们将深入探讨如何使用Flink CDC来监测MySQL数据库,并且实现自定义反序列化,以及如何通过Flink API和Flink SQL两种方式进行数据处理。 首先,让我们理解什么是CDC。CDC是一种数据库复制技术,它...

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

    在MySQL中,自增序列(Sequence)是一种常用于生成唯一标识符的数据结构,尤其是在Oracle数据库中广泛使用。然而,MySQL自身并不直接支持Sequence,但可以通过创建表和存储过程来模拟这个功能。本教程将详细解释如何...

    mysql模拟序列,支持事务

    网上大多使用表和函数来模拟序列,但函数内部不支持直接使用数据提交,实际使用中,有可能出现数据回滚。为了解决这个问题,改用存储过程来实现。没有经过大量测试,只做了初步测试。新项目中,我会使用,但目前是否...

    MySQL 序列使用

    如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。 本章我们将介绍如何使用MySQL的序列。 使用 AUTO_INCREMENT MySQL 中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列。 实例 以下...

    MySQL实现类似Oracle序列的方案

    MySQL实现类似Oracle的序列 Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的; 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长、开始索引、...

    MySQL生成Oracle序列参考案例

    本文档提供了一个详细的迁移案例,以及相关的SQL脚本,使得在MySQL中可以实现与Oracle序列相似的功能。 首先,文档介绍了一个名为`sequence`的表结构,这个表是模拟Oracle序列的核心组件。在这个表中,我们存储了...

    mysql-sequence:nodejs的mysql序列生成器

    MySQL序数生成器是开发...以上就是关于"mysql-sequence"这个Node.js MySQL序列生成器的基本介绍和使用方法。通过这个库,开发者可以在不依赖数据库特定功能的情况下,高效地管理序列,提高应用程序的灵活性和可靠性。

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...

    oracle迁移mysql自增序列问题

    Oracle数据库中,自增序列通常通过Sequence对象实现,而MySQL则通过在表定义中设置`AUTO_INCREMENT`属性来实现自增主键。 在描述中,我们看到一个具体的例子,首先创建了一个名为`test`的MySQL表,包含两个字段:`...

Global site tag (gtag.js) - Google Analytics