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

          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)  
          posted on 2010-03-09 10:25 周銳 閱讀(1124) 評論(0)  編輯  收藏 所屬分類: MySQL
          主站蜘蛛池模板: 神池县| 西平县| 桂阳县| 元阳县| 清丰县| 岢岚县| 临洮县| 托克托县| 哈密市| 正蓝旗| 新昌县| 浙江省| 汉源县| 泸定县| 吴旗县| 平南县| 黔江区| 金溪县| 鹤山市| 湖北省| 安庆市| 房产| 鲁甸县| 九江市| 临猗县| 蓬安县| 繁昌县| 石河子市| 东莞市| 岳西县| 册亨县| 盘山县| 攀枝花市| 白城市| 吴川市| 孟连| 右玉县| 嘉兴市| 奇台县| 莎车县| 石林|