void

          mysql 自增序列(轉)

          1:原理是在建立一個觸發器TRIGGER tri_NewBH 在table插入時執行序列計算 mysql> CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),`date` DATETIME,val INT); Query OK, 0 rows affected (0.05 sec) mysql> mysql> mysql> DELIMITER $$ mysql> DROP TRIGGER IF EXISTS tri_NewBH $$ Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> mysql> CREATE TRIGGER tri_NewBH BEFORE INSERT ON tb -> FOR EACH ROW -> BEGIN -> DECLARE dt CHAR(8); -> DECLARE bh_id CHAR(16); -> DECLARE number INT; -> DECLARE new_bh VARCHAR(16); -> -> SET dt = DATE_FORMAT(CURDATE(),'%Y%m%d'); -> -> SELECT -> MAX(BH) INTO bh_id -> FROM tb -> WHERE BH LIKE CONCAT(dt,'%'); -> -> IF bh_id = '' OR bh_id IS NULL THEN -> SET new_bh = CONCAT(dt,'00000001'); -> ELSE -> SET number = RIGHT(bh_id,8) + 1; -> SET new_bh = RIGHT(CONCAT('00000000',number),8); -> SET new_bh=CONCAT(dt,new_bh); -> END IF; -> -> SET NEW.BH = new_bh; -> END$$ Query OK, 0 rows affected (0.09 sec) mysql> mysql> DELIMITER ; mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM tb; +------------------+---------+---------------------+------+ | BH | content | date | val | +------------------+---------+---------------------+------+ | 2009051100000001 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2009051100000002 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2009051100000003 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2009051100000004 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2011051200000001 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2011051200000002 | LiangCK | 2009-05-11 00:00:00 | 20 | | 2011051200000003 | LiangCK | 2009-05-11 00:00:00 | 20 | +------------------+---------+---------------------+------+ 7 rows in set (0.00 sec)

           

          2.下面就是另外一個的實現方案: 

          原理是創建一個專門記錄序列的表sequence,記錄有當前序列號,序列的間隔如+1

           

          Sql代碼  收藏代碼
          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 $/*創建一個獲取當前序列的function*/  
          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 ;  

           測試一下結果:

           

           

          Sql代碼  收藏代碼
          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 

          //獲取下一個數值..先在sequence里面調用update當前最大數值+1然后再調用currval獲得當前數值
          Sql代碼  收藏代碼
          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 ;  
           mysql> select nextval('MovieSeq');
          Sql代碼  收藏代碼
          1. +---------------------+  
          2. | nextval('MovieSeq') |  
          3. +---------------------+  
          4. |                  15 |  
          5. +---------------------+  
          6. 1 row in set (0.09 sec)  
          7.   
          8. mysql> select nextval('MovieSeq');  
          9. +---------------------+  
          10. | nextval('MovieSeq') |  
          11. +---------------------+  
          12. |                  20 |  
          13. +---------------------+  
          14. 1 row in set (0.01 sec)  
          15.   
          16. mysql> select nextval('MovieSeq');  
          17. +---------------------+  
          18. | nextval('MovieSeq') |  
          19. +---------------------+  
          20. |                  25 |  
          21. +---------------------+  
          22. 1 row in set (0.00 sec)  
           setval 
          Sql代碼  收藏代碼
          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 ;  
           mysql> select setval('MovieSeq',150);
          Sql代碼  收藏代碼
          1. +------------------------+  
          2. | setval('MovieSeq',150) |  
          3. +------------------------+  
          4. |                    150 |  
          5. +------------------------+  
          6. 1 row in set (0.06 sec)  
          7.   
          8. mysql> select curval('MovieSeq');  
          9. +---------------------+  
          10. | currval('MovieSeq') |  
          11. +---------------------+  
          12. |                 150 |  
          13. +---------------------+  
          14. 1 row in set (0.00 sec)  
          15.   
          16. mysql> select nextval('MovieSeq');  
          17. +---------------------+  
          18. | nextval('MovieSeq') |  
          19. +---------------------+  
          20. |                 155 |  
          21. +---------------------+  
          22. 1 row in set (0.00 sec)  
           

          posted on 2015-04-29 17:33 void 閱讀(901) 評論(0)  編輯  收藏 所屬分類: MySql 、Hibernate

          主站蜘蛛池模板: 汝南县| 伊吾县| 英吉沙县| 高唐县| 铁力市| 蕲春县| 焉耆| 武宁县| 卢龙县| 理塘县| 平潭县| 长春市| 黎川县| 汾西县| 和林格尔县| 鹤庆县| 临潭县| 蒙自县| 屯昌县| 麻城市| 德州市| 大化| 贺州市| 曲靖市| 启东市| 镇沅| 仁化县| 涿州市| 株洲市| 萝北县| 永善县| 高邮市| 德格县| 吉隆县| 南开区| 公主岭市| 田阳县| 禹城市| 分宜县| 邳州市| 会昌县|