MySQL---ORACLE序列解决方案

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

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代码
DROP FUNCTION IF EXISTS nextval;    
DELIMITER $    
CREATE FUNCTION nextval (seq_name VARCHAR(50))    
RETURNS INTEGER    
CONTAINS SQL    
BEGIN    
    UPDATE sequence    
    SET           current_value = current_value + increment    
    WHERE name = seq_name;    
    RETURN currval(seq_name);    
END$    
DELIMITER ;   

DROP FUNCTION IF EXISTS nextval;
DELIMITER $
CREATE FUNCTION nextval (seq_name VARCHAR(50))
RETURNS INTEGER
CONTAINS SQL
BEGIN
   UPDATE sequence
   SET          current_value = current_value + increment
   WHERE name = seq_name;
   RETURN currval(seq_name);
END$
DELIMITER ;


Java代码
mysql> select nextval('MovieSeq');    
+---------------------+    
| nextval('MovieSeq') |    
+---------------------+    
|                  15 |    
+---------------------+    
1 row in set (0.09 sec)    
   
mysql> select nextval('MovieSeq');    
+---------------------+    
| nextval('MovieSeq') |    
+---------------------+    
|                  20 |    
+---------------------+    
1 row in set (0.01 sec)    
   
mysql> select nextval('MovieSeq');    
+---------------------+    
| nextval('MovieSeq') |    
+---------------------+    
|                  25 |    
+---------------------+    
1 row in set (0.00 sec)   

mysql> select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  15 |
+---------------------+
1 row in set (0.09 sec)

mysql> select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  20 |
+---------------------+
1 row in set (0.01 sec)

mysql> select nextval('MovieSeq');
+---------------------+
| nextval('MovieSeq') |
+---------------------+
|                  25 |
+---------------------+
1 row in set (0.00 sec)


setval 
Java代码
DROP FUNCTION IF EXISTS setval;    
DELIMITER $    
CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)    
RETURNS INTEGER    
CONTAINS SQL    
BEGIN    
    UPDATE sequence    
    SET           current_value = value    
    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
CONTAINS SQL
BEGIN
   UPDATE sequence
   SET          current_value = value
   WHERE name = seq_name;
   RETURN currval(seq_name);
END$
DELIMITER ;


Java代码mysql> select setval('MovieSeq',150);    
+------------------------+    
| setval('MovieSeq',150) |    
+------------------------+    
|                    150 |    
+------------------------+    
1 row in set (0.06 sec)    
   
mysql> select curval('MovieSeq');    
+---------------------+    
| currval('MovieSeq') |    
+---------------------+    
|                 150 |    
+---------------------+    
1 row in set (0.00 sec)    
   
mysql> select nextval('MovieSeq');    
+---------------------+    
| nextval('MovieSeq') |    
+---------------------+    
|                 155 |    
+---------------------+    
1 row in set (0.00 sec)

 

CREATE TABLE `test1` ( 
`id` int(11) NOT NULL, 
`name` varchar(11) default NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY (`name`) 
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值