oracle 实现自增长

MySQL自增长与Oracle序列的区别: 
自增长只能用于表中的其中一个字段 
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用. 
自增长会把一个未指定或NULL值的字段自动填上. 

在mysql中添加序列,请看下面的实例: 
在MYSQL里有这样一张表: 

  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;  
  1. INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);  
  2. INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);  

在ORACLE是这样的: 

  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;  
  1. INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);  

在oracle下为表添加一个触发器,就可以实现mysql自增长功能: 

  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风格: 

  1. INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);  

下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL. 
我们假设在mysql中序列的语法是: 


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

下面就是 CURRRVAL 的实现方案: 

  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 ;  

测试一下结果:

  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  

  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 ; 
  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  

  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 ;
  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)  

版权声明:
作者:SE_Meng
链接:https://www.cnesa.cn/2414.html
来源:CNESA
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
oracle 实现自增长
MySQL自增长与Oracle序列的区别: 自增长只能用于表中的其中一个字段 自增长只能被分配给固定表的固定的某一字段,不能被多个表共用. 自增长会把一个未指定或NULL值的字段自动填上. 在mysql中添加序列,请看下面的实例: 在MYSQL里有这样一张表:  CREATE TABLE Movie(   id           INT NOT NULL AUTO_INCREMENT,   name     VARCHAR(60) NOT NULL,   released YEAR NOT NULL,   PRIMARY KEY (id)   ) ENGINE=InnoDB;   INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);   INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);   在ORACLE是这样的:  CREATE TABLE Movie(   id          INT NOT NULL,   name     VARCHAR2(60) NOT NULL,   released INT NOT NULL,   PRIMARY KEY (id)   );   CREATE SEQUENCE MovieSeq;   INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);   在oracle下为表添加一个触发器,就可以实现mysql自增长功能:  CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG   BEFORE INSERT ON Movie   FOR EACH ROW   BEGIN     SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;   END BRI_MOVIE_TRG;   .   RUN;   这样,插件记录就可以成为MYSQL风格:  INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);   下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL. 我们假设在mysql中序列的语法是:  NEXTVAL(’sequence’); CURRVAL(’sequence’); SETVAL(’sequence’,value); 下面就是 CURRRVAL 的实现方案:  DROP TABLE IF EXISTS sequence;   CREATE TABLE sequence (   name              VARCHAR(50) NOT NULL,   current_value INT NOT NULL,   increment       I……
<<上一篇
下一篇>>