Home > Database > Mysql Tutorial > body text

MySQL序列解决方案_MySQL

WBOY
Release: 2016-06-01 13:44:36
Original
1005 people have browsed it

bitsCN.com

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

作者“ERDP技术架构”

bitsCN.com
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!