mysql中落实类似oracle中的nextval函数

— Sequence 管理表
DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence (
         name VARCHAR(50) NOT NULL,
         current_value INT NOT NULL,
         increment INT NOT NULL DEFAULT 1,
         PRIMARY KEY (name)
) ENGINE=InnoDB;
 
— 取当前值的函数
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ”
BEGIN
         DECLARE value INTEGER;
         SET value = 0;
         SELECT current_value INTO value
                   FROM sequence
                   WHERE name = seq_name;
         RETURN value;
END
$
DELIMITER ;
 
— 取下一个值的函数
DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ”
BEGIN
         UPDATE sequence
                   SET current_value = current_value + increment
                   WHERE name = seq_name;
         RETURN currval(seq_name);
END
$
DELIMITER ;
 
— 更新当前值的函数
DROP FUNCTION IF EXISTS setval;
DELIMITER $
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)
         RETURNS INTEGER
         LANGUAGE SQL
         DETERMINISTIC
         CONTAINS SQL
         SQL SECURITY DEFINER
         COMMENT ”
BEGIN
         UPDATE sequence
                   SET current_value = value
                   WHERE name = seq_name;
         RETURN currval(seq_name);
END
$
DELIMITER ;
 
/*
— 测试
INSERT INTO sequence VALUES (‘TestSeq’, 0, 1);
SELECT SETVAL(‘TestSeq’, 10);
SELECT CURRVAL(‘TestSeq’);
SELECT NEXTVAL(‘TestSeq’);
*/

MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.
在mysql中添加序列,请看下面的实例:
在MYSQL里有这样一张表:
 
Java代码
 
CREATE TABLE Movie(  
id INT NOT NULL AUTO_INCREMENT,  
name VARCHAR(60) NOT NULL,  
released YEAR NOT NULL,  
PRIMARY KEY (id)  
) ENGINE=InnoDB;  
 
CREATE TABLE Movie(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(60) NOT NULL,
released YEAR NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;
 
Java代码
 
INSERT INTO Movie (name,released) VALUES (‘Gladiator’,2000);  
INSERT INTO Movie (id,name,released) VALUES (NULL,’The Bourne
Identity’,1998);  
INSERT INTO Movie (name,released) VALUES (‘Gladiator’,2000);
INSERT INTO Movie (id,name,released) VALUES (NULL,’The Bourne
Identity’,1998);
 
在ORACLE是这样的:
 
Java代码
 
CREATE TABLE Movie(  
id INT NOT NULL,  
name VARCHAR2(60) NOT NULL,  
released INT NOT NULL,  
PRIMARY KEY (id)  
);  
 
CREATE SEQUENCE MovieSeq;  
 
CREATE TABLE Movie(
id INT NOT NULL,
name VARCHAR2(60) NOT NULL,
released INT NOT NULL,
PRIMARY KEY (id)
);
 
CREATE SEQUENCE MovieSeq;
 
Java代码
 
INSERT INTO Movie (id,name,released) VALUES
(MovieSeq.NEXTVAL,’Gladiator’,2000);  
INSERT INTO Movie (id,name,released) VALUES
(MovieSeq.NEXTVAL,’Gladiator’,2000);
 
在oracle下为表添加一个触发器,就可以实现mysql自增长功能:
 
Java代码
 
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;  
 
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风格:
 
Java代码
 
INSERT INTO Movie (name,released) VALUES (‘The Lion King’,1994);  
INSERT INTO Movie (name,released) VALUES (‘The Lion King’,1994);
 
下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL.
我们假设在mysql中序列的语法是:
 
NEXTVAL(’sequence’);
CURRVAL(’sequence’);
SETVAL(’sequence’,value);
 
下面就是CURRRVAL的实现方案:
 
Java代码
 
DROP TABLE IF EXISTS sequence;  
CREATE TABLE sequence (  
name VARCHAR(50) NOT NULL,  
current_value INT NOT NULL,  
increment INT NOT NULL DEFAULT 1,  
PRIMARY KEY (name)  
) ENGINE=InnoDB;  
INSERT INTO sequence VALUES (‘MovieSeq’,3,5);  
DROP FUNCTION IF EXISTS currval;  
DELIMITER $  
CREATE FUNCTION currval (seq_name VARCHAR(50))  
RETURNS INTEGER  
CONTAINS SQL  
BEGIN  
DECLARE value INTEGER;  
SET value = 0;  
SELECT current_value INTO value  
FROM sequence  
WHERE name = seq_name;  
RETURN value;  
END$  
DELIMITER ;  
 
DROP TABLE IF EXISTS sequence;
 
CREATE TABLE sequence (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1,
PRIMARY KEY (name)
) ENGINE=InnoDB;
 
INSERT INTO sequence VALUES (‘MovieSeq’,3,5);
DROP FUNCTION IF EXISTS currval;
DELIMITER $
CREATE FUNCTION currval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT current_value INTO value
FROM sequence
WHERE name = seq_name;
RETURN value;
END$
DELIMITER ;
 
测试一下结果:
 
Java代码
 

mysql中实现类似oracle中的nextval函数

作者 json的博客

  1. mysql> SELECT currval(‘MovieSeq’);  
  2. 澳门金沙vip,+———————+  
  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)  
     
    mysql> SELECT currval(‘MovieSeq’);
     
    +———————+
     
    | currval(‘MovieSeq’) |
     
    +———————+
     
    |                   3 |
     
    +———————+
     
    1 row in set (0.00 sec)
     
    mysql> SELECT currval(‘x’);
     
    +————–+
     
    | currval(‘x’) |
     
    +————–+
     
    |            0 |
     
    +————–+
     
    1 row in set, 1 warning (0.00 sec)
     
    mysql> show warnings;
     
    +———+——+——————+
     
    | Level   | Code | Message          |
     
    +———+——+——————+
     
    | Warning | 1329 | No data to FETCH |
     
    +———+——+——————+
     
    1 row in set (0.00 sec)
     
    nextval
     
    Java代码
     
  22. DROP FUNCTION IF EXISTS nextval;  
  23. DELIMITER $  
  24. CREATE FUNCTION nextval (seq_name VARCHAR(50))  
  25. RETURNS INTEGER  
  26. CONTAINS SQL  
  27. BEGIN  
    7.    UPDATE sequence  
    8.    SET current_value = current_value + increment  
    9.    WHERE name = seq_name;  
    10.    RETURN currval(seq_name);  
  28. END$  
  29. DELIMITER ;  
     
    Java代码
     
  30. mysql> select nextval(‘MovieSeq’);  
  31. +———————+  
  32. | nextval(‘MovieSeq’) |  
  33. +———————+  
  34. |                  15 |  
  35. +———————+  
  36. 1 row in set (0.09 sec)  
    8.   
  37. mysql> select nextval(‘MovieSeq’);  
  38. +———————+  
  39. | nextval(‘MovieSeq’) |  
  40. +———————+  
  41. |                  20 |  
  42. +———————+  
  43. 1 row in set (0.01 sec)  
    16.   
  44. mysql> select nextval(‘MovieSeq’);  
  45. +———————+  
  46. | nextval(‘MovieSeq’) |  
  47. +———————+  
  48. |                  25 |  
  49. +———————+  
  50. 1 row in set (0.00 sec)
     
    setval
     
    Java代码
     
  51. DROP FUNCTION IF EXISTS setval;  
  52. DELIMITER $  
  53. CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)  
  54. RETURNS INTEGER  
  55. CONTAINS SQL  
  56. BEGIN  
    7.    UPDATE sequence  
    8.    SET current_value = value  
    9.    WHERE name = seq_name;  
    10.    RETURN currval(seq_name);  
  57. END$  
  58. DELIMITER ;  
     
    Java代码
     
  59. mysql> select setval(‘MovieSeq’,150);  
  60. +————————+  
  61. | setval(‘MovieSeq’,150) |  
  62. +————————+  
  63. |                    150 |  
  64. +————————+  
  65. 1 row in set (0.06 sec)  
    8.   
  66. mysql> select curval(‘MovieSeq’);  
  67. +———————+  
  68. | currval(‘MovieSeq’) |  
  69. +———————+  
  70. |                 150 |  
  71. +———————+  
  72. 1 row in set (0.00 sec)  
    16.   
  73. mysql> select nextval(‘MovieSeq’);  
  74. +———————+  
  75. | nextval(‘MovieSeq’) |  
  76. +———————+  
  77. |                 155 |  
  78. +———————+  
  79. 1 row in set (0.00 sec) 

 

Sequence 管理表 DROP TABLE IF EXISTS sequence;
CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, current_value INT
NOT NULL, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (na…

作者“ERDP技术架构”

我们知道mysql中是不支持sequence的,一般是建表的时间使这个字段自增。

:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增…

  www.2cto.com  

  如       create table table_name(id int auto_increment primary key,
…);

 

             或者alter table table_ame add id int auto_increment
primary key  //字段,一定设置为primary key

 

             或者重设自增字段的起步值 alter table table_name
AUTO_INCREMENT=n

 

但是我们在oracle中经常使用sequence_name.nextval,或者在程序中我们使用先select
sequence_name.value from
dual.如果我们的开发框架要同时支持oracle和mysql。一般会把取sequence提出来。如果在mysql中提供一个类似的函数,这样提出来会比较方便些。这是一种使用的场景。下面就说说怎么在mysql中实现一个nextval函数吧。

  www.2cto.com  

1先建一表

 

Sql代码  

CREATE TABLE `sys_sequence` (  

    `NAME` varchar(50) NOT NULL,  

    `CURRENT_VALUE` int(11) NOT NULL DEFAULT ‘0’,  

    `INCREMENT` int(11) NOT NULL DEFAULT ‘1’,  

    PRIMARY KEY (`NAME`)