oracle sequence转mysql(mysql实现oracle的sequence功能)

最近项目上在做数据转移工作,需要把oracle转为mysql,在转换oracle储存过程中遇见这样一句sql,查的是序列号的下一个值
在这里插入图片描述
由于mysq只有递增列的概念没有oracle的sequence功能,这样对于以前习惯用oracle数据库开发的程序员不太实用,尤其在要使用nextval在获取增长序列的时候。这样就设计一个能模拟oracle sequence的功能。
思路:我们可以用一张表来记录sequence数据,其实在使用oracle sequence的时候也类似是一张表,currentval、nextval和增长系数就类似表中的字段。而currentval、nextval我们可以设计成两个function这样在调用的时候返回currentval、nextval的值。

1 创建表

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

2 插入一条数据

INSERT INTO js_sys_sequence VALUES ('SEQ_BB_QS_KCXMJCBJZHZSBB_ID',10000,1);

3 创建当前值function

set global log_bin_trust_function_creators=TRUE;

DELIMITER $ 
DROP FUNCTION IF EXISTS currval;
CREATE FUNCTION currval (seq_name VARCHAR(50))  
RETURNS INTEGER  
CONTAINS SQL  
BEGIN  
-- 获取当前值的函数
  DECLARE current INTEGER;  
  SET current = 0;  
  SELECT currentValue INTO current  
  FROM js_sys_sequence  
  WHERE seqname = seq_name;  
  RETURN current;  
END$ 
DELIMITER ;

查询:select currval('SEQ_BB_QS_KCXMJCBJZHZSBB_ID')
oracle sequence转mysql(mysql实现oracle的sequence功能)_第1张图片
4 创建下一个值function

DELIMITER $  
CREATE FUNCTION nextval (seq_name VARCHAR(50))  
RETURNS INTEGER  
CONTAINS SQL  
BEGIN  
-- 获取下一个值;
   UPDATE js_sys_sequence  
   SET currentValue = currentValue + increment  
   WHERE seqname = seq_name;  
   RETURN currval(seq_name);  
END$  
DELIMITER ; 

查询:select nextval('SEQ_BB_QS_KCXMJCBJZHZSBB_ID')
oracle sequence转mysql(mysql实现oracle的sequence功能)_第2张图片

你可能感兴趣的:(数据库)