序列:SEQUENCE
一、序列介绍
Oracle的序列是一种数据库对象,主要作用是用来产生唯一值。序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享。
二、创建序列
序列使用CREATE SEQUENCE语法进行创建:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
- NCREMENT BY:用于定义序列的步长,如果省略,则默认为1,如果是负值,则代表序列的值是递减的。
- START WITH:定义序列的初始值(即产生的第一个值),默认为1。
- MAXVALUE:定义序列能生成的最大值。NOMAXVALUE是默认选项,代表没有最大值,这时,对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
- MINVALUE:定义序列能生成的最小值。NOMINVALUE是默认选项,代表没有最小值,这时,对于递减序列,系统能够产生的最小值是负的10的26次方;对于递减序列,最小值是1。
- CYCLE和NOCYCLE:表示当序列生成器的值达到限制后是否循环。如果循环,当递增序列达到最大值时,循环到最小值;对于递减序列,达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。
- CACHE:定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
例如:
CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;
三、查询序列
一旦序列被创建,序列的创建代码就被文本化在数据字典中,可以在user_objects数据字典中看到,如:
SELECT object_name,object_id,object_type FROM user_objects WHERE object_name = 'INVOICE_SEQ';
在user_sequences表中保存了序列明细信息:
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
四、使用序列
NEXTVAL和CURRVAL伪列
- NEXTVAL:返回下一个可用的序列值,它每次返回一个唯一的被引用值,实际对不同的用户也是如此。当使用sequence.NEXTVAL时,一个新的序列数被产生并且当前的序列数被放入CURRVAL。
- CURRVAL:获得当前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的话,会报错。
使用如下 :
SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL; INSERT INTO invoice (invoice_id, vendor_id, invoice_number, invoice_total )
VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100 );
可以在下面的上下文中使用NEXTVAL和CURRVAL:
- 不是子查询的一部分的SELECT语句的字段列表。
- INSERT语句中子查询的SELECT列表。
- INSERT语句中的VALUES子句。
- UPDATE语句中的SET子句。
不能再以下的上下文中使用NEXTVAL和CURRVAL:
- 视图的SELECT列表。
- 带DISTINCT的SELECT语句。
- 带GROUP BY、HAVING或ORDER BY子句的SELECT语句。
- 在SELECT、DELETE或UPDATE语句中的子句。
- 在CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。
另外要注意,ROLLBACK并不能使序列值回滚。
五、修改序列
如:
ALTER SEQUENCE invoice_seq INCREMENT BY 2 MAXVALUE 10 NOCACHE NOCYCLE;
修改序列时,有如下几个限制:
- 不能该表序列的起始值。
- 最小值不能大于当前值。
- 最大值不能小于当前值。
- 修改后的序列规则不会影响以前的序列值,只有未来的序列值会受到影响。
- 用户必须具有ALTER SEQUENCE的权限。
六、删除序列
DROP SEQUENCE invoice_seq;
七、创建自增序列
1、创建一个序列
create sequence sq_recid
minvalue 1 maxvalue 999999 increment by 1 start with 1 noCYCLE;
2、创建一个触发器
create or replace trigger trg_test
before insert on test for each row
begin
select sq_recid.nextval into :new.ID from dual;
end; alter trigger trg_test enable;
3、在C#中也可以手工插入序列到表中
string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
retuing ID into :ID"
序列:SEQUENCE的更多相关文章
- Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence
Oracle新表使用序列(sequence)作为插入值,初始值不是第一个,oraclesequence 使用oracle11g插入数据时遇到这样一个问题: 1 --创建测试表-- 2 CREATE T ...
- Oracle序列(Sequence)创建、使用、修改、删除
Oracle对象课程:序列(Sequence)创建.使用.修改.删除,序列(Sequence)是用来生成连续的整数数据的对象.序列常常用来作为主键中增长列,序列中的可以升序生成,也可以降序生成.创建序 ...
- 序列sequence中的cache问题
Oracle中序列Sequence的创建语法如下: CREATE SEQUENCE [ schema. ] sequence [ { INCREMENT BY | START WITH } integ ...
- oracle数据库--序列(sequence)
一个问题: 在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长,怎么处理? 解决方式:oracle是利用"序列"(sequence)来完成的. ...
- Oracle数据库中序列(SEQUENCE)的用法详解
Oracle数据库中序列(SEQUENCE)的用法详解 在Oracle数据库中,序列的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值.本文我们主要介绍了 ...
- Oracle 序列(sequence)
序列(sequence) 是Oracle提供的用于生成一系列唯一数字的数据库对象.它会自动生成顺序递增或者递减的序列号,以实现自动提供唯一的主键值.序列可以在多用户并发环境中使用,并且可以为所有用户生 ...
- oracle 序列sequence
查询所有的序列: select 'create sequence '||sequence_name|| ' minvalue '||min_value|| ' maxvalue '||max_valu ...
- 序列(SEQUENCE)
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一 ...
- 【洛谷】【堆+结论】P4597 序列sequence
[题目背景:] 原题cf13c 数据加强版(就是说原来能用DP做现在不行了QwQ) [题目描述:] 给定一个序列,每次操作可以把某个数+1-1.要求把序列变成非降数列.而且要求修改后的数列只能出现修改 ...
- 洛谷 P4597 序列sequence 解题报告
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
随机推荐
- 腾讯的网站如何检测到你的 QQ 已经登录?
转:http://www.lovelucy.info/tencent-sso.html 在 QQ 已经登录的情况下,手动输入网址打开 QQ 邮箱 或者 QQ 空间 等腾讯网站,可以看到网页已经检测到本 ...
- 【转帖】AMD Zen之父、Intel副总Jim Keller到底有多牛?
AMD Zen之父.Intel副总Jim Keller到底有多牛? https://www.cnbeta.com/articles/tech/907295.htm 几乎玩过 所有的中国国产化CPU的祖 ...
- Apache Kafka安全| Kafka的需求和组成部分
1.目标 - 卡夫卡安全 今天,在这个Kafka教程中,我们将看到Apache Kafka Security 的概念 .Kafka Security教程包括我们需要安全性的原因,详细介绍加密.有了这 ...
- Windows的socket编程
################服务端 1.准备工作导入头文件 #include<WinSock2.h> #pragma comment(lib, "ws2_32.lib&quo ...
- php位运算及其高级应用
我们之前学过逻辑与(&&) 条件1 && 条件2 当两边条件同时成立时候返回1 逻辑或(||) 条件1 || 条件2 当两边条件只要有一 ...
- 10分钟用scratch写一个大鱼吃小鱼的小游戏
第一次给张江小朋友教Scratch课程之前,还在担心一些概念能不能向小朋友解释清楚,可上完课发现,我严重低估了小朋友的聪明程度,发现现在的孩子相比较自己8.9岁的时候,简直聪明太多倍了. 所以总结了半 ...
- CF778D Parquet Re-laying 构造
传送门 如果\(2 \not\mid M\),就把两个图折一下,把\(N\ M\)互换,这样就可以保证\(2 \mid M\). 因为操作可逆,所以我们可以选择一个中间状态,把起始和终点状态都变成这个 ...
- 前端开发 ECMAScript-1概述
https://www.cnblogs.com/gaoya666/p/8560745.html ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Com ...
- PreparedStatement和批处理
1.概述 PreparedStatement 接口继承了 Statement,并与之在两方面有所不同,它表示预编译的 SQL 语句对象. 首先,数据库会对预编译语句提供性能优化.因为预编译语句有可能被 ...
- 【转载】 C#使用Math.PI常量来表示圆周率
在C#中计算圆形面积的时候,我们时常会用到圆周率这个变量,圆周率我们一般定义为十进制decimal类型变量,圆周率的值为3.1415926535等一个近似值,其实在C#的数值计算类Math类中,有专门 ...