MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.

在mysql中添加序列,请看下面的实例:
在MYSQL里有这样一张表:

  1. CREATE TABLE Movie(
  2. id           INT NOT NULL AUTO_INCREMENT,
  3. name     VARCHAR(60) NOT NULL,
  4. released YEAR NOT NULL,
  5. PRIMARY KEY (id)
  6. ) 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;

  1. INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);
  2. 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是这样的:

  1. CREATE TABLE Movie(
  2. id          INT NOT NULL,
  3. name     VARCHAR2(60) NOT NULL,
  4. released INT NOT NULL,
  5. PRIMARY KEY (id)
  6. );
  7. 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;

  1. INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);

INSERT INTO Movie (id,name,released) VALUES (MovieSeq.NEXTVAL,'Gladiator',2000);

在oracle下为表添加一个触发器,就可以实现mysql自增长功能:

  1. CREATE OR REPLACE TRIGGER BRI_MOVIE_TRG
  2. BEFORE INSERT ON Movie
  3. FOR EACH ROW
  4. BEGIN
  5. SELECT MovieSeq.NEXTVAL INTO :new.id FROM DUAL;
  6. END BRI_MOVIE_TRG;
  7. .
  8. 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风格:

  1. 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的实现方案:

  1. DROP TABLE IF EXISTS sequence;
  2. CREATE TABLE sequence (
  3. name              VARCHAR(50) NOT NULL,
  4. current_value INT NOT NULL,
  5. increment       INT NOT NULL DEFAULT 1,
  6. PRIMARY KEY (name)
  7. ) ENGINE=InnoDB;
  8. INSERT INTO sequence VALUES ('MovieSeq',3,5);
  9. DROP FUNCTION IF EXISTS currval;
  10. DELIMITER $
  11. CREATE FUNCTION currval (seq_name VARCHAR(50))
  12. RETURNS INTEGER
  13. CONTAINS SQL
  14. BEGIN
  15. DECLARE value INTEGER;
  16. SET value = 0;
  17. SELECT current_value INTO value
  18. FROM sequence
  19. WHERE name = seq_name;
  20. RETURN value;
  21. END$
  22. 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 ;

测试一下结果:

  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

  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 ;

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 ;

  1. mysql> select nextval('MovieSeq');
  2. +---------------------+
  3. | nextval('MovieSeq') |
  4. +---------------------+
  5. |                  15 |
  6. +---------------------+
  7. 1 row in set (0.09 sec)
  8. mysql> select nextval('MovieSeq');
  9. +---------------------+
  10. | nextval('MovieSeq') |
  11. +---------------------+
  12. |                  20 |
  13. +---------------------+
  14. 1 row in set (0.01 sec)
  15. mysql> select nextval('MovieSeq');
  16. +---------------------+
  17. | nextval('MovieSeq') |
  18. +---------------------+
  19. |                  25 |
  20. +---------------------+
  21. 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

  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 ;

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 ;

  1. mysql> select setval('MovieSeq',150);
  2. +------------------------+
  3. | setval('MovieSeq',150) |
  4. +------------------------+
  5. |                    150 |
  6. +------------------------+
  7. 1 row in set (0.06 sec)
  8. mysql> select curval('MovieSeq');
  9. +---------------------+
  10. | currval('MovieSeq') |
  11. +---------------------+
  12. |                 150 |
  13. +---------------------+
  14. 1 row in set (0.00 sec)
  15. mysql> select nextval('MovieSeq');
  16. +---------------------+
  17. | nextval('MovieSeq') |
  18. +---------------------+
  19. |                 155 |
  20. +---------------------+
  21. 1 row in set (0.00 sec)

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)

分享到:

参考知识库
MySQL知识库

20189  关注 | 1446  收录

评论

MySQL序列解决方案的更多相关文章

  1. mysql 序列与pg序列的比较

    mysql序列(这里只谈innodb引擎): 在使用mysql的AUTO_INCREMENT时,使用AUTO_INCREMENT的字段必须建有索引,也可以为索引的一部分.当没有索引时会报错:      ...

  2. 远程无法连接Mysql 的解决方案

    问题描述: 新安装了MySQL 5.6,使用root用户无法远程连接, 提示Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL ...

  3. MySQL 序列使用

    MySQL 序列使用 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如 ...

  4. 【已解决】Windows下 MySQL大小写敏感 解决方案及分析

    Windows下 MySQL大小写敏感配置 zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-3-27 最近在window ...

  5. MySQL 序列 AUTO_INCREMENT

    MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列 ...

  6. 二十九、MySQL 序列使用

    MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍 ...

  7. DB-MySQL:MySQL 序列使用

    ylbtech-DB-MySQL:MySQL 序列使用 1.返回顶部 1. MySQL 序列使用 MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想 ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 序列使用

    MySQL 序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 使用 AUTO_INCREMENT ...

  9. mysql error 1130 hy000:Host 'localhost' is not allowed to connect to this mysql server 解决方案

    ERROR 1130 (HY000): Host 'localhost' is not allowed to connect to this MySQL server D:\Wamp\mysql-\b ...

随机推荐

  1. linux--网络管理-ifconfig,route,netstat,ip,ss,dns,主机名网卡名修改bond

    cat /etc/services 查看常见端口对应的服务 查一查某个端口号,是哪个进程在用  lsof  -i :6010 49152-65535:动态端口或私有端口,客户端程序随机使用的端口  其 ...

  2. RestTemplate的异常 Not enough variables available to expand

    当使用 RestTemplate 可能会遇到异常: Not enough variables available to expand 典型如下: @Autowired private RestTemp ...

  3. 解决:mui 的 选项卡 + 下拉刷新 功能,在其中嵌入 iframe 后,在 iphone 的情况下,iframe 的内容不能滚动,只显示第一屏内容。

    我所遇到的情况是,使用 mui 的 选项卡 + 下拉刷新 功能时,其中有2个页面是嵌入了别的网站的页面,而别个几个是通过 ajax 加载本网站的数据.然后 在其中嵌入 iframe 后,在 iphon ...

  4. 前端学习 之 CSS(一)

    一:什么是 CSS? ·CSS 指层叠样式表 (Cascading Style Sheets) ·样式定义如何显示 HTML 元素 ·样式通常存储在样式表中 ·把样式添加到 HTML 4.0 中,是为 ...

  5. SpringBoot与Mybatis-plus整合,代码生成mvc层

    一.添加pom依赖 <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifac ...

  6. JavaWeb开发记录全过程--(1)环境配置

    一. 开发工具:idea 理由:根据idea 如何连接服务器,可以直接在idea上连接服务器 安装:根据IntelliJ IDEA 下载安装(含注册码),进行非常规手段使用idea 二.分析问题: # ...

  7. Linux 修改/etc/profile 出错 导致所有命令都 command not found 的解决办法

    执行命令 export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 然后再修改/etc/profile 再执行文件: source /etc/p ...

  8. [CEOI 2004]锯木厂选址

    Description 题库链接 从山顶上到山底下沿着一条直线种植了 \(n\) 棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能朝山下运.山脚下有一个 ...

  9. java垃圾回收学习

    经过一个晚上的努力终于完成了一个文件替换指定字符串的程序,但是由于我要替换的全站程序html文件太多, 所以eclipse下边老是在一个目录结束后报出java.lang.OutOfMemoryErro ...

  10. FFmpeg——命令笔记

    1. 获取 dshow设备列表 ffmpeg -list_devices true -f dshow -i dummy 2. 通过UDP流推ts文件: ffmpeg.exe -re -i zhen.t ...