MySQL序列解决方案

MySQL序列解决方案

    <div class="news_tag"><a href="http://www.iteye.com/blogs/tag/MySQL">MySQL</a><a href="http://www.iteye.com/blogs/tag/Oracle">Oracle</a><a href="http://www.iteye.com/blogs/tag/SQL">SQL</a>&nbsp;</div>
	  
	
	
	
  </div>

MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.

在mysql中添加序列,请看下面的实例:
在MYSQL里有这样一张表:

Java代码
  1. CREATE TABLE Movie(     
  2. id           INT NOT NULL AUTO_INCREMENT,     
  3. name     VARCHAR(60) NOT NULL,     
  4. released YEAR NOT NULL,     
  5. PRIMARY KEY (id)     
  6. ) ENGINE=InnoDB;   

Java代码
  1. INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);     
  2. INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);   

在ORACLE是这样的:

Java代码
  1. CREATE TABLE Movie(     
  2. id          INT NOT NULL,     
  3. name     VARCHAR2(60) NOT NULL,     
  4. released INT NOT NULL,     
  5. PRIMARY KEY (id)     
  6. );     
  7. CREATE SEQUENCE MovieSeq;   

Java代码
  1. INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);   

在oracle下为表添加一个触发器,就可以实现mysql自增长功能:

Java代码
  1. CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG     
  2. BEFORE INSERT ON Movie     
  3. FOR EACH ROW     
  4. BEGIN     
  5.   SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;     
  6. END BRI_MOVIE_TRG;     
  7. .     
  8. RUN;  

这样,插件记录就可以成为MYSQL风格:

Java代码
  1. INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);   

下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL.
我们假设在mysql中序列的语法是:

NEXTVAL(’sequence’);
CURRVAL(’sequence’);
SETVAL(’sequence’,value);

下面就是CURRRVAL的实现方案:

Java代码
  1. DROP TABLE IF EXISTS sequence;     
  2. CREATE TABLE sequence (     
  3. name              VARCHAR(50) NOT NULL,     
  4. current_value INT NOT NULL,     
  5. increment       INT NOT NULL DEFAULT 1,     
  6. PRIMARY KEY (name)     
  7. ) ENGINE=InnoDB;     
  8. INSERT INTO sequence VALUES ('MovieSeq',3,5);     
  9. DROP FUNCTION IF EXISTS currval;     
  10. DELIMITER $     
  11. CREATE FUNCTION currval (seq_name VARCHAR(50))     
  12. RETURNS INTEGER     
  13. CONTAINS SQL     
  14. BEGIN     
  15.   DECLARE value INTEGER;     
  16.   SET value = 0;     
  17.   SELECT current_value INTO value     
  18.   FROM sequence     
  19.   WHERE name = seq_name;     
  20.   RETURN value;     
  21. END$     
  22. DELIMITER ;  

测试一下结果:

Java代码
  1. mysql> SELECT currval('MovieSeq');     
  2. +---------------------+     
  3. | currval('MovieSeq') |     
  4. +---------------------+     
  5. |                   3 |     
  6. +---------------------+     
  7. 1 row in set (0.00 sec)     
  8. mysql> SELECT currval('x');     
  9. +--------------+     
  10. | currval('x') |     
  11. +--------------+     
  12. |            0 |     
  13. +--------------+     
  14. 1 row in set, 1 warning (0.00 sec)     
  15. mysql> show warnings;     
  16. +---------+------+------------------+     
  17. | Level   | Code | Message          |     
  18. +---------+------+------------------+     
  19. | Warning | 1329 | No data to FETCH |     
  20. +---------+------+------------------+     
  21. 1 row in set (0.00 sec)  

nextval

Java代码
  1. DROP FUNCTION IF EXISTS nextval;     
  2. DELIMITER $     
  3. CREATE FUNCTION nextval (seq_name VARCHAR(50))     
  4. RETURNS INTEGER     
  5. CONTAINS SQL     
  6. BEGIN     
  7.    UPDATE sequence     
  8.    SET          current_value = current_value + increment     
  9.    WHERE name = seq_name;     
  10.    RETURN currval(seq_name);     
  11. END$     
  12. DELIMITER ;   

Java代码
  1. mysql> select nextval('MovieSeq');     
  2. +---------------------+     
  3. | nextval('MovieSeq') |     
  4. +---------------------+     
  5. |                  15 |     
  6. +---------------------+     
  7. 1 row in set (0.09 sec)     
  8.     
  9. mysql> select nextval('MovieSeq');     
  10. +---------------------+     
  11. | nextval('MovieSeq') |     
  12. +---------------------+     
  13. |                  20 |     
  14. +---------------------+     
  15. 1 row in set (0.01 sec)     
  16.     
  17. mysql> select nextval('MovieSeq');     
  18. +---------------------+     
  19. | nextval('MovieSeq') |     
  20. +---------------------+     
  21. |                  25 |     
  22. +---------------------+     
  23. 1 row in set (0.00 sec)   

setval

Java代码
  1. DROP FUNCTION IF EXISTS setval;     
  2. DELIMITER $     
  3. CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)     
  4. RETURNS INTEGER     
  5. CONTAINS SQL     
  6. BEGIN     
  7.    UPDATE sequence     
  8.    SET          current_value = value     
  9.    WHERE name = seq_name;     
  10.    RETURN currval(seq_name);     
  11. END$     
  12. DELIMITER ;   

Java代码
  1. mysql> select setval('MovieSeq',150);     
  2. +------------------------+     
  3. | setval('MovieSeq',150) |     
  4. +------------------------+     
  5. |                    150 |     
  6. +------------------------+     
  7. 1 row in set (0.06 sec)     
  8.     
  9. mysql> select curval('MovieSeq');     
  10. +---------------------+     
  11. | currval('MovieSeq') |     
  12. +---------------------+     
  13. |                 150 |     
  14. +---------------------+     
  15. 1 row in set (0.00 sec)     
  16.     
  17. mysql> select nextval('MovieSeq');     
  18. +---------------------+     
  19. | nextval('MovieSeq') |     
  20. +---------------------+     
  21. |                 155 |     
  22. +---------------------+     
  23. 1 row in set (0.00 sec)  

<div id="share_weibo">分享到:
  <a data-type="sina" href="javascript:;" title="分享到新浪微博"><img src="/images/sina.jpg"></a>
  <a data-type="qq" href="javascript:;" title="分享到腾讯微博"><img src="/images/tec.jpg"></a>
</div>
  • 2011-02-12 00:12
  • 浏览 376
  • 评论(0)
  •   <li class="last"><a href="http://www.iteye.com/wiki/blog/1093304" target="_blank" class="more">相关推荐</a></li>
    </ul>    
    
参考知识库
    <dl class="dlnewlist">
    
      <dd><a target="_blank" href="http://lib.csdn.net/base/mysql"><img src="http://img.knowledge.csdn.net/upload/base/1454051093684_684.jpg" width="58" height="58" alt=""></a></dd>
      <dt>
          <a target="_blank" href="http://lib.csdn.net/base/mysql" classs="title">MySQL知识库</a>
          <span>
             <em>20189</em>&nbsp;&nbsp;关注 <i>|</i> <em>1446</em>&nbsp;&nbsp;收录                  
          </span>
      </dt>
  
    </dl>
    
  </div>
评论
posted @ 2017-03-06 15:17  jobs-lgy  阅读(595)  评论(0编辑  收藏  举报