zoukankan      html  css  js  c++  java
  • 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>
    
    评论
  • 相关阅读:
    JavaScript经典效果集锦之五(转)
    消息队列函数
    ipcs查看消息队列命令
    sizeof的解析
    【转】使用Reporting Services制做可折叠的报表
    【转】Hibernate动态条件查询(Criteria Query)
    【Wonder原创】NHibernate调用存储过程
    【转】C# const和readonly的区别
    【转】人际关系经验
    winform只存在一个进程处理
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/6510088.html
Copyright © 2011-2022 走看看