MySQL序列的解决方法
创始人
2024-12-21 04:43:02
0次

MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.
在中添加序列,请看下面的实例:
在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数据里使用序列语法.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) 

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...