MySQL序列解决方案

来源:互联网 发布:京东云主机 绑定域名 编辑:程序博客网 时间:2024/05/18 00:04
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)  
原创粉丝点击