最近在做一个抽奖的业务时,用到了Oracle序列,但是线网数据库上线后出现了一个小bug,不得不去重新认识下Oracle的序列。
总结几点
(1)序列适合生成唯一且连续的主键值,但是个人认为不太适合生成具有业务意义的字段,在这个业务中用生成的序列作为用户抽奖编号,以此判断用户是否中奖,具有业务意义的字段,是否用max函数去生成这个编号会更好,但是使用max函数的话会不会有并发问题。使多个用户抽到同一个编号
(2)当使用到序列的事务发生回滚。会造成序列号不连续。在用生成的序列值作为抽奖编号做插入数据库操作时,可能遇到事务提交失败,从而导致序号不连续。
(3)大量语句发生请求,申请序列时,为了避免序列在运用层实现序列而引起的性能瓶颈。Oracle序列允许将序列提前生成 cache x个先存入内存,在发生大量申请序列语句时,可直接到运行最快的内存中去得到序列。但cache个数也不能设置太大,因为在数据库重启时,会清空内存信息,预存在内存中的序列会丢失,当数据库再次启动后,序列从上次内存中最大的序列号+1 开始存入cache x个。这种情况也能会在数据库关闭时也会导致序号不连续。
下面学习下Oracle的序列
其实说起序列这个其实很简单,但是如果只不了解的话还是会在上面栽跟头。
1、Create Sequence
(注释:你需要有CREATE SEQUENCE或CREATE ANY
SEQUENCE权限)
CREATE
SEQUENCE SEQ_EXAMPLE
INCREMENT BY 1 ——
每次加几个
START WITH 1 —— 从几开始计数
MAXVALUE 999999999—— 最大值
NOMAXVALUE —— 不设置最大值
NOCYCLE —— 一直累加,不循环
CYCLE
CACHE 10;—— 不设置缓存大小
只要定义了
SEQ_EXAMPLE ,你就可以用使CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
例如:
SEQ_EXAMPLE.CURRVAL
SEQ_EXAMPLE.NEXTVAL
//查询序列的当前值
select
SEQ_EXAMPLE.currval from dual;
需要注意的是:
第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就会是不一样的。
- 假如指定CACHE值,Oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组 到cache. 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失。 所以可以在create sequence的时候用nocache防止这种情况。
2、Alter Sequence
你需要有sequence的owner,或者拥有ALTER ANY SEQUENCE
权限才能改动sequence. 可以alter除start至以外的所有sequence参数。如果想要改变start值,必须 drop sequence 再 re-create .
Alter
sequence示例:
ALTER SEQUENCE emp_sequence INCREMENT BY
10 MAXVALUE 10000 CYCLE -- 到10000后从头开始 NOCACHE ;
可以影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
3、Drop Sequence
DROP
SEQUENCE
SEQ_EXAMPLE ;
分享到:
相关推荐
在Java应用程序中,如果需要在MySQL环境中实现类似Oracle序列的功能,我们需要自己设计解决方案。以下是一些关键知识点的详细说明: 1. **Java连接MySQL**: - 首先,你需要使用JDBC(Java Database Connectivity...
本文将详细介绍如何在不新建序列的情况下,实现Oracle序列的重置,让其从1开始增长。这种方法通过编写PL/SQL过程来动态调整序列的增量,从而达到重置的目的。 ### Oracle序列重置方法 首先,我们需要理解Oracle...
### MySQL生成Oracle序列知识点 #### 一、背景与概述 在数据库领域中,不同数据库管理系统(DBMS)之间存在显著差异,比如Oracle与MySQL在处理序列(sequence)的方式上就有本质的不同。Oracle提供了内置的支持来管理...
批量修改Oracle序列值的需求可能出现在数据迁移、恢复或测试环境中,确保序列与实际数据匹配。这篇博客分享的是一个自定义的存储过程,用于批量修改Oracle序列的当前值(CURRENT VALUE)。 首先,我们需要理解...
本文将深入探讨Oracle序列主键自增长的工作原理、创建方法以及如何在表中应用。 **1. Oracle序列(Sequences)基础** Oracle序列是一个数据库对象,它可以生成一系列唯一的数字,这些数字可以被用作表的主键。序列...
Oracle序列是数据库中用于生成唯一标识符的一种机制,它们在数据表中经常被用来作为主键或外键,确保数据的唯一性和完整性。在Oracle数据库系统中,序列(Sequences)提供了一种自动递增或递减数值的方式,这对于...
在本篇中,我们将深入探讨Oracle序列的创建、修改和删除。 ### 1. 序列的创建 创建序列的基本语法如下: ```sql CREATE SEQUENCE sequence_name START WITH n -- 起始值 INCREMENT BY n -- 增量值 MINVALUE n ...
**一、Oracle序列** 序列是一种特殊类型的数据库对象,它可以生成唯一的整数序列,常用于为数据库表的主键字段提供自动递增的值。序列的主要属性包括: 1. **INCREMENT BY**:指定序列值每次增长或减少的量。默认...
### Oracle序列的用法 在Oracle数据库中,序列是一种非常实用的对象类型,它主要用于自动产生唯一的数字标识符,常用于自动生成主键等场景。序列是数据库中的对象,它可以生成连续的整数,通常用于为主键字段提供...
本文档提供了一个详细的迁移案例,以及相关的SQL脚本,使得在MySQL中可以实现与Oracle序列相似的功能。 首先,文档介绍了一个名为`sequence`的表结构,这个表是模拟Oracle序列的核心组件。在这个表中,我们存储了...
网上很多讲序列的文章,但是讲的不够详细,看了这个,秒懂 oracle的用法,内容包含使用场景全冲用法介绍
本文将深入探讨如何使用PL/SQL工具来导出Oracle序列,并详细阐述相关的步骤。 首先,让我们了解Oracle序列的基本概念。序列由一系列连续的整数组成,可以设置起始值、增量和最大值等属性。创建序列的基本语法如下:...
本文主要探讨了如何创建和使用Oracle序列。 一、创建序列 创建序列的SQL语句如下: ```sql create sequence 序列名 [minvalue n] [maxvalue n] [increment by n] [start with n] [cache n|nocache] [order|...
### SQL Server 中创建类似 Oracle 序列的存储过程 #### 背景介绍 在数据库管理系统(DBMS)中,序列是一种自增的数据结构,常用于自动产生唯一标识符(如ID)。Oracle 数据库提供了非常方便的序列机制,而 SQL ...
### 二、Oracle序列 序列是Oracle提供的一种自动生成唯一数值的机制,常用于为主键或需要唯一标识符的列自动分配值。在实验中,虽然没有明确展示序列的创建与使用,但可以利用`CREATE SEQUENCE`语句来创建一个序列...
Oracle序列创建及使用(txt文本),Oracle序列创建及使用(txt文本),Oracle序列创建及使用(txt文本)
### Oracle序列和触发器的建立 #### 序列(Sequence) 在Oracle数据库中,序列是一种自动产生数值的对象,常用于为主键字段提供唯一值。序列主要用于实现表中的自增ID功能,例如,当用户需要为某张表的主键设置自...
然而,MySQL数据库默认并不提供与Oracle序列完全相同的功能,而是通过`AUTO_INCREMENT`属性来实现自增长的主键。但是,`AUTO_INCREMENT`有一些限制,比如无法自定义步长、起始值或循环等特性。为了解决这个问题,...
#### 一、理解Oracle序列 在开始之前,首先需要了解Oracle中的序列。序列是一个数据库对象,它能够生成连续的整数序列。序列主要用于当需要为表中的某列自动生成唯一值时。例如,在插入新记录时,可以使用序列生成...