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 ;   






猜你喜欢

转载自dannyhz.iteye.com/blog/2412842
今日推荐