MySQL序列的解决方法

70次阅读
没有评论

共计 5254 个字符,预计需要花费 14 分钟才能阅读完成。

MySQL 序列的解决方法,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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(rsquo;sequence rsquo;);
CURRVAL(rsquo;sequence rsquo;);
SETVAL(rsquo;sequence rsquo;,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) 

看完上述内容,你们掌握 MySQL 序列的解决方法的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计5254字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)