用mysql实现oracle sequence功能

来源:互联网 发布:painter软件的内存大小 编辑:程序博客网 时间:2024/06/06 06:30

出处:http://blog.csdn.net/maidou_2011/article/details/7758282

[sql] view plaincopy
  1.   
由于mysq只有递增列的概念没有oracle的sequence功能,这样对于以前习惯用oracle数据库开发的程序员不太实用,尤其在要使用nextval在获取增长序列的时候。这样就设计一个能模拟oracle sequence的功能。

  思路:我们可以用一张表来记录sequence数据,其实在使用oracle sequence的时候也类似是一张表,currentval、nextval和增长系数就类似表中的字段。而currentval、nextval我们可以设计成两个function这样在调用的时候返回currentval、nextval的值。

  设计表seqMsql:

[sql] view plaincopy
  1. CREATE TABLE seqMysql   
  2. (    
  3. seqname VARCHAR(50) NOT NULL,  --sequence名称  
  4. currentValue INT NOT NULL,  --当前sequence值  
  5. increment INT NOT NULL DEFAULT 1,  --增长系数  
  6. PRIMARY KEY (seqname)    
  7. ) ENGINE=InnoDB;    

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

[sql] view plaincopy
  1. +------------+--------------+-----------+  
  2. | seqname    | currentValue | increment |  
  3. +------------+--------------+-----------+  
  4. | browserSeq |        10002 |         1 |  
  5. +------------+--------------+-----------+  
  6. 1 row in set  

         获取当前值function:

[sql] view plaincopy
  1. DELIMITER $   
  2. CREATE FUNCTION currval (seq_name VARCHAR(50))    
  3. RETURNS INTEGER    
  4. CONTAINS SQL    
  5. BEGIN    
  6.   DECLARE current INTEGER;    
  7.   SET current = 0;    
  8.   SELECT currentValue INTO current    
  9.   FROM seqMysql    
  10.   WHERE seqname = seq_name;    
  11.   RETURN current;    
  12. END$   
  13. DELIMITER ;  

        查询:

[sql] view plaincopy
  1. mysql> SELECT currval('browserSeq');  
  2. +--------------------+  
  3. | currval('browserSeq')|  
  4. +--------------------+  
  5. |              10002 |  
  6. +--------------------+  
  7. 1 row in set  

        获取下一个值function:

[sql] view plaincopy
  1. DELIMITER $    
  2. CREATE FUNCTION nextval (seq_name VARCHAR(50))    
  3. RETURNS INTEGER    
  4. CONTAINS SQL    
  5. BEGIN    
  6.    UPDATE seqMysql    
  7.    SET currentValue = currentValue + increment    
  8.    WHERE seqname = seq_name;    
  9.    RETURN currval(seq_name);    
  10. END$    
  11. DELIMITER ;   

       查询:

[sql] view plaincopy
  1. mysql> SELECT nextval('browserSeq');  
  2. +-----------------------+  
  3. | nextval('browserSeq') |  
  4. +-----------------------+  
  5. |                      10003 |  
  6. +-----------------------+  
  7. 1 row in set  

       设置增长系数function:

[sql] view plaincopy
  1. DELIMITER $    
  2. CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)    
  3. RETURNS INTEGER    
  4. CONTAINS SQL    
  5. BEGIN    
  6.    UPDATE seqMysql    
  7.    SET currentValue = value    
  8.    WHERE seqname = seq_name;    
  9.    RETURN currval(seq_name);    
  10. END$    
  11. DELIMITER ;   

0 0