`
meetrice
  • 浏览: 197444 次
  • 来自: 南京
社区版块
存档分类
最新评论

MySQL序列解决方案

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

在mysql中添加序列,请看下面的实例:
在MYSQL里有这样一张表:
CREATE TABLE Movie(
id           INT NOT NULL AUTO_INCREMENT,
name     VARCHAR(60) NOT NULL,
released YEAR NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB;

INSERT INTO Movie (name,released) VALUES ('Gladiator',2000);
INSERT INTO Movie (id,name,released) VALUES (NULL,'The Bourne Identity',1998);

在ORACLE是这样的:
CREATE TABLE Movie(
id          INT NOT NULL,
name     VARCHAR2(60) NOT NULL,
released INT NOT NULL,
PRIMARY KEY (id)
);
CREATE SEQUENCE MovieSeq;

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


在oracle下为表添加一个触发器,就可以实现mysql自增长功能:
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风格:
INSERT INTO Movie (name,released) VALUES ('The Lion King',1994);


下面我们来看看如何在mysql数据里使用Oracle序列语法.NEXTVAL 和 .CURVAL.
我们假设在mysql中序列的语法是:

    NEXTVAL(’sequence’);
    CURRVAL(’sequence’);
    SETVAL(’sequence’,value);


下面就是CURRRVAL的实现方案:

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 ;

测试一下结果:
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

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 ;


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
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 ;


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)
分享到:
评论
10 楼 phil09s 2012-10-11  
原来LZ的翻译过来的。~看英文原版顺畅多了。哈哈哈。不过LZ翻译的也不错啊~:)
9 楼 Surmounting 2012-07-13  
shuishou147 写道
如果使用别人的代码请注释原文
http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/

原来是这样呀……
8 楼 shuishou147 2012-05-09  
如果使用别人的代码请注释原文
http://ronaldbradford.com/blog/sequences-in-mysql-2006-01-26/
7 楼 ftzlp1314 2011-10-27  
楼主好强
6 楼 liuxi1024 2011-08-13  
楼主厉害啊,太牛了。
5 楼 fuanyu 2011-01-21  
楼主mysql真不错。这样的方案才写出来了。谢谢你。很受用..
4 楼 skzr.org 2010-07-16  
你好,我有一个疑问,不知道使用function是不是事务会有问题
A访问nextVal('test')获取到值 n
B访问nextVal('test')时,A执行了rollback
那么B获得的是n还是n+1?
谢谢了
3 楼 hcqenjoy 2010-02-02  
NEXTVAL 好文章 解决大问题了
2 楼 xuyao 2009-05-06  
select setval('MovieSeq',150); 
1 楼 hksy 2008-10-08  
  

相关推荐

    Mysql(序列/ID)生成方案

    一种可能的解决方案是使用`LAST_INSERT_ID()`函数配合`SELECT...FOR UPDATE`语句。当多个并发线程尝试获取新的ID时,每个线程都会锁定表中的特定行,然后通过`LAST_INSERT_ID()`获取当前的ID并增加它。这样可以确保...

    java通过Mysql实现类似oracle序列功能序列.rar

    在Java应用程序中,如果需要在MySQL环境中实现类似Oracle序列的功能,我们需要自己设计解决方案。以下是一些关键知识点的详细说明: 1. **Java连接MySQL**: - 首先,你需要使用JDBC(Java Database Connectivity...

    flinkcdc-mysql自定义反序列化器.pdf

    这样的灵活性大大增强了Flink CDC解决方案的适用范围和集成能力。 ### 自定义反序列化器的多种应用场景 在Flink CDC环境中,自定义反序列化器的应用场景非常广泛。它可以用于处理不同类型的数据库,例如除了MySQL...

    MySQL实现中文全文检索的解决方案.pdf

    MySQL 实现中文全文检索的解决方案 在 MySQL 中,实现中文全文检索是一项挑战性的任务,因为 MySQL 不支持中文字符的全文检索。但是,我们可以通过一些 trick 和解决方案来实现中文全文检索。本文将讨论两种解决...

    MySQL生成Oracle序列参考案例

    通过上述方法,即使MySQL原生不支持序列对象,我们也能够通过一些创造性的解决方案来实现类似Oracle的序列功能。这个案例不仅展示了数据库迁移时的技巧,同时也提供了使用MySQL进行高级数据库操作的例证,对于希望在...

    MySQL实现类似Oracle序列的方案

    这种方式灵活性较高,可以根据需要定制序列的行为,为迁移数据库或在MySQL中实现Oracle序列特性提供了解决方案。通过这种方式,我们可以确保在MySQL中实现类似于Oracle序列的逻辑,从而更好地适应各种业务场景。

    在MySQL中创建实现自增的序列(Sequence)的教程

    在MySQL中,自增序列(Sequence)是一种常用于生成唯一标识符的数据结构,尤其是在Oracle...在高并发环境中,可能需要考虑使用其他解决方案,如分布式ID生成服务(如Twitter的Snowflake或Apache Kafka的UUID生成)。

    C++ mysql查询 C++17编写 可以自动序列化到定义的结构体,支持json类型

    `.sln`文件则是一个Visual Studio解决方案文件,包含了项目的配置信息和编译设置。 总结来说,这个项目提供了一个高效且易于使用的C++17 MySQL查询框架,具备自动序列化到结构体的能力,同时支持JSON数据类型。这...

    Mysql事务并发问题解决方案

    本篇文章将深入探讨MySQL中的事务并发问题及其解决方案,包括悲观锁和乐观锁的应用。 首先,问题背景是在视频观看记录更新场景中,当用户观看进度达到100%时,后续请求不再更新。然而,由于并发事务处理不当,出现...

    AWS全球数据库解决方案三剑客.pptx

    AWS 全球数据库解决方案三剑客 在本篇文章中,我们将探讨 AWS 全球数据库解决方案的“三剑客”,即 Aurora 全球数据库、DynamoDB 全球表和 ElastiCache 全球数据存储。这些解决方案能够满足全球数据库的需求,提供...

    利用mysql实现的雪花算法案例

    但这些方法在分表后不再适用,因此需要寻找新的解决方案。 2. 解决方案对比 - 数据库表维护:在特定数据库中维护一个自增ID表,每次需要ID时加锁更新,但并发性能较低。 - Redis管理:Redis的单线程特性可以保证ID...

    MYSQL第三方库文件

    - 针对MySQL集群和分片,有如`mysql-connector-python`和`Galera Cluster`等解决方案,提供高可用性和数据一致性。 6. **安全和认证**: - 库如`PyMySQL`支持SSL连接,增强了数据传输的安全性。 - `mysql-...

    mysql-5.1.53.tar.gz linux安装包

    遇到这些问题时,应根据错误提示进行排查,查阅官方文档或者在线社区的解决方案。 总之,MySQL 5.1.53在Linux上的安装涉及到一系列步骤,包括源码解压、编译、安装和配置。了解这些步骤对于管理和维护自己的数据库...

    MySql.Data6.5.4.rar

    MySQL.Data是MySQL数据库连接.NET应用程序的一个重要组件,用于在C#、VB.NET等.NET环境中与MySQL服务器进行交互。...对于遇到问题的开发者,查找和尝试不同版本的MySQL.Data.dll是一种常见的解决方案策略。

    利用Prometheus与Grafana对Mysql服务器的性能监控详解

    Prometheus是一款源自Google Borgmon的开源监控系统,它采用Golang进行开发,并被誉为下一代监控解决方案。Prometheus通过HTTP协议从目标服务(如MySQL服务器)抓取监控指标,这些数据存储在本地的时间序列数据库中...

    MySql.Data.dll

    Unity提供了一些内置的序列化工具,但可能需要自定义解决方案来处理特定的游戏数据结构。 总结来说,MySQL.Data.dll是Unity连接MySQL数据库的关键组件,通过它,开发者可以方便地进行数据存取,实现游戏与数据库的...

    如何监控mysql,redis运行状况(CPU,内存)

    另外,`Nagios`和`Zabbix`也是常见的监控解决方案,能够监控MySQL的多种性能指标。 二、Redis监控 1. **Redis内置监控**:Redis命令`INFO`提供了服务器状态信息,包括内存、客户端连接、命令统计等。使用`INFO ...

    基于C#试题库管理系统(MySQL).zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

Global site tag (gtag.js) - Google Analytics