posts - 431,  comments - 344,  trackbacks - 0
          原文地址: http://meetrice.javaeye.com/blog/89426

          MySQL
          自增長與Oracle序列的區(qū)別:
          自增長只能用于表中的其中一個(gè)字段
          自增長只能被分配給固定表的固定的某一字段,不能被多個(gè)表共用.
          自增長會(huì)把一個(gè)未指定或NULL值的字段自動(dòng)填上.

          mysql中添加序列,請(qǐng)看下面的實(shí)例:
          MYSQL里有這樣一張表:
          Java代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          1. INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);   
          2. INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);  

          在ORACLE是這樣的:
          Java代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          1. INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);  


          在oracle下為表添加一個(gè)觸發(fā)器,就可以實(shí)現(xiàn)mysql自增長功能:
          Java代碼 復(fù)制代碼
          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風(fēng)格:
          Java代碼 復(fù)制代碼
          1. INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);  


          下面我們來看看如何在mysql數(shù)據(jù)里使用Oracle序列語法.NEXTVAL 和 .CURVAL.
          我們假設(shè)在mysql中序列的語法是:

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


          下面就是CURRRVAL的實(shí)現(xiàn)方案:

          Java代碼 復(fù)制代碼
          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 ;  

          測(cè)試一下結(jié)果:
          Java代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          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代碼 復(fù)制代碼
          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)  
          posted on 2010-03-09 10:25 周銳 閱讀(1129) 評(píng)論(0)  編輯  收藏 所屬分類: MySQL
          主站蜘蛛池模板: 克什克腾旗| 江安县| 湖口县| 阿合奇县| 阳朔县| 德州市| 鞍山市| 阳高县| 泸溪县| 白朗县| 简阳市| 包头市| 奉贤区| 鹤山市| 衡水市| 克什克腾旗| 郧西县| 永福县| 铁力市| 延吉市| 三亚市| 佛山市| 五华县| 互助| 祥云县| 夏邑县| 文成县| 喀喇| 山阳县| 邵阳市| 含山县| 陇南市| 淅川县| 民乐县| 通山县| 略阳县| 阿拉善右旗| 红桥区| 鄂尔多斯市| 彰化市| 宣化县|