`

mysql中实现类似oracle中的nextval函数

阅读更多

我们知道mysql中是不支持sequence的,一般是建表的时间使这个字段自增。

  如       create table table_name(id int auto_increment primary key, ...);

             或者alter table table_ame add id int auto_increment primary key  //字段,一定设置为primary key

             或者重设自增字段的起步值 alter table table_name AUTO_INCREMENT=n

但是我们在oracle中经常使用sequence_name.nextval,或者在程序中我们使用先select sequence_name.value from dual.如果我们的开发框架要同时支持oracle和mysql。一般会把取sequence提出来。如果在mysql中提供一个类似的函数,这样提出来会比较方便些。这是一种使用的场景。下面就说说怎么在mysql中实现一个nextval函数吧。

1先建一表

CREATE TABLE `sys_sequence` (
    `NAME` varchar(50) NOT NULL,
    `CURRENT_VALUE` int(11) NOT NULL DEFAULT '0',
    `INCREMENT` int(11) NOT NULL DEFAULT '1',
    PRIMARY KEY (`NAME`)
  )

 

 

2.然后建立函数

DELIMITER $$
DROP FUNCTION IF EXISTS `currval`$$
CREATE DEFINER=`root`@`%` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS INT(11)
BEGIN
    DECLARE VALUE INTEGER;
    SET VALUE=0;
    SELECT current_value INTO VALUE
    FROM sys_sequence 
    WHERE NAME=seq_name;
    RETURN VALUE;
    END$$
 
DELIMITER ;
 
 
CREATE DEFINER=`root`@`%` FUNCTION `nextval`(seq_name varchar(50)) RETURNS int(11)
 BEGIN
     UPDATE sys_sequence
     SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT
     where  name=seq_name;
     return currval(seq_name);
     END
 
 
CREATE DEFINER=`root`@`%` FUNCTION `setval`(seq_name varchar(50),value integer) RETURNS int(11)
 BEGIN
     update sys_sequence 
     set current_value=value
     where name=seq_name;
     return currval(seq_name);
     END

 

 

 测试下 select nextval('name') ; 搞定。

分享到:
评论

相关推荐

    mysql currval 和 nextval 函数的实现.txt

    本文将详细介绍如何在MySQL中实现类似`currval`和`nextval`的功能,这两个函数分别用于获取当前值和下一个值。 #### 关键概念解析 1. **currval**: 该函数返回序列的当前值。 2. **nextval**: 该函数将序列的当前值...

    MySQL实现类似Oracle序列的方案

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

    MySQL生成Oracle序列参考案例

    通过上述方法,即使MySQL原生不支持序列对象,我们也能够通过一些创造性的解决方案来实现类似Oracle的序列功能。这个案例不仅展示了数据库迁移时的技巧,同时也提供了使用MySQL进行高级数据库操作的例证,对于希望在...

    mysql生成oracle序列

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

    MYSQL到ORACLE程序迁移的注意事项

    MySQL到Oracle数据库迁移的过程中,需要注意一系列的差异和调整,以确保迁移后的应用程序能够正常运行。以下是一些关键点的详细说明: 1. **自动增长的数据类型处理**: 在MySQL中,`AUTO_INCREMENT`字段自动分配...

    Oracle到mysql转换的问题总结要点.doc

    - Oracle的`NEXTVAL`函数在MySQL中可通过自定义函数或`LAST_INSERT_ID()`实现类似功能。 4. **翻页查询**: - MySQL使用`LIMIT`关键字进行分页,如`LIMIT m, n`,从第m+1条开始取n条数据。 5. **函数转换**: -...

    Oracle与MYSQL的几点区别

    - Oracle不直接支持表级别的自增长字段,而是提供了`SEQUENCE`对象来实现类似功能。 - 示例:创建一个序列并将其用于插入操作。 ```sql CREATE SEQUENCE seq_id INCREMENT BY 1 START WITH 1 MAXVALUE 99999 ...

    mysql和oracle区别.docx

    在 Oracle 中,要实现自动增长,需要创建一个序列(SEQUENCE)并在插入记录时手动使用序列的 NEXTVAL 属性。 3. **字符串引用**: MySQL 允许使用双引号来包围字符串,而 Oracle 只接受单引号。在 Oracle 中,如果...

    Oracle到mysql转换的问题总结.docx

    ORDER BY ...)`窗口函数在MySQL中没有直接对应项,但可以使用用户变量模拟类似功能。 - Oracle的`ROWNUM`行号在MySQL中需要通过自定义变量实现。 在进行Oracle到MySQL的转换时,了解并掌握这些差异是确保数据迁移...

    Oracle到mysql转换的问题总结.doc

    而在 Oracle 中,需要创建序列(Sequences)并配合 `NEXTVAL` 函数来实现类似的功能。 4. **翻页查询**: - MySQL 可以使用 `LIMIT m, n` 来实现分页,比如 `SELECT * FROM table LIMIT 10, 20` 会返回第 11 到 30...

    mysql和oracle区别.pdf

    日期的转换在两个系统中也有所不同,MySQL 有 SUBDATE 和 INTERVAL 函数,Oracle 有 TO_DATE 和 TO_CHAR 函数,以及 DATE字段的数学运算。 7. **时间戳操作**: - MySQL 有 NOW(), CURDATE(), 和 CURTIME() 函数...

    Oracle.VS.Mysql

    相比之下,**MySQL**中与Oracle用户概念类似的是**database**。在MySQL中,登录后首先需创建一个database,然后才能在其中建表。默认创建的database有**mysql**和**test**。创建数据库使用`create database`命令,且...

    Oracle与MySQL的几点区别

    在MySQL中,由于不支持直接创建序列,通常会采用其他方法来实现类似的功能,比如通过触发器或者表中的自增字段来实现。但在Oracle中,可以轻松地创建序列并使用它来自动生成唯一值。 例如,在Oracle中可以通过以下...

    Oracle与MySQL的几点区别.docx

    Oracle 则需要使用 ROWNUM 和子查询来实现类似功能。以下是两种常见的 Oracle 分页查询方法: - 方法一: ```sql SELECT ID, [FIELD_NAME,...] FROM TABLE_NAME WHERE ID IN ( SELECT ID FROM (SELECT ROWNUM...

Global site tag (gtag.js) - Google Analytics