posts - 431,  comments - 344,  trackbacks - 0
          公告
           Don't Repeat Yourself
          座右銘:you can lose your money, you can spent all of it, and if you work hard you get it all back. But if you waste your time, you're never gonna get it back.
          公告本博客在此聲明部分文章為轉(zhuǎn)摘,只做資料收集使用。


          微信: szhourui
          QQ:109450684
          Email
          lsi.zhourui@gmail.com
          <2010年3月>
          28123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          留言簿(15)

          隨筆分類(1019)

          文章分類(3)

          文章檔案(21)

          收藏夾

          Link

          好友博客

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 862642
          • 排名 - 44

          最新評論

          閱讀排行榜

          原文地址: http://meetrice.javaeye.com/blog/89426

          MySQL
          自增長與Oracle序列的區(qū)別:
          自增長只能用于表中的其中一個字段
          自增長只能被分配給固定表的固定的某一字段,不能被多個表共用.
          自增長會把一個未指定或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下為表添加一個觸發(fā)器,就可以實現(xiàn)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數(shù)據(jù)里使用Oracle序列語法.NEXTVAL 和 .CURVAL.
          我們假設(shè)在mysql中序列的語法是:

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


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

          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 ;  

          測試一下結(jié)果:
          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 周銳 閱讀(1122) 評論(0)  編輯  收藏 所屬分類: MySQL
          主站蜘蛛池模板: 丹寨县| 凭祥市| 巴林左旗| 淅川县| 天全县| 同心县| 淮滨县| 万州区| 诸暨市| 项城市| 宁国市| 遂宁市| 芷江| 翁牛特旗| 莱西市| 兰考县| 东兰县| 绵阳市| 轮台县| 广灵县| 饶阳县| 迁西县| 大宁县| 元氏县| 手游| 静宁县| 灵武市| 常熟市| 丹寨县| 滕州市| 新晃| 分宜县| 花莲县| 兴业县| 吉林省| 盐边县| 福海县| 新昌县| 平果县| 宁远县| 乌苏市|