分享更有价值
被信任是一种快乐

MySQL序列的解决方法

文章页正文上

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(’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)
) ENGI免费主机域名NE=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序列的解决方法的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注云技术行业资讯频道,感谢各位的阅读!

相关推荐: Oracle Database 19c中自动索引的功能介绍

这篇文章主要介绍“Oracle Database 19c中自动索引的功能介绍”,在日常操作中,相信很多人在Oracle Database 19c中自动索引的功能介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle Da…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册