小弟初学oracle,建表都有一个主建id字段,想将每个表的id都设为自动增长列,如sql server的identity(1,1)。但oracel好像没有这个概念,网上找了一下有个叫SEQUENCE,但怎么取看不懂,求高人指点一下!
如何在每个表都有一个互不干扰的SEQUENCE,即每个表的id插入的值都从1开始,怎样做到?从建立到插入id的值,求指点,最好有个例子!小弟感激不尽!
如何在每个表都有一个互不干扰的SEQUENCE,即每个表的id插入的值都从1开始,怎样做到?从建立到插入id的值,求指点,最好有个例子!小弟感激不尽!
解决方案 »
- php查询oracle 临时表,为什么为空
- sqlldr 可以用来给db link的table 装载数据吗?
- 请问这个SQL能实现吗? 又该如何写?
- 求<<21天学通PL/SQL>>电子书(要清晰版的)
- 一个非常非常奇怪的问题,简直错的没有道理!求救ing~~
- 关于修改临时表数据结构的问题
- 请教:9i下能否将某个用户下的某个表导出直接生成文本文件?
- 怎么把图片上传到数据库?
- 如何用最少的程序判断表的某条纪录不存在
- 清除表数据
- 按10-30,30-50,50-70,70-90区段查询
- 关于SELECT USERNAME FROM TABLE_USER WHERE USER_ID IN(1,2,3,4);
1、Create Sequence
(注释:你需要有CREATE SEQUENCE或CREATE ANY SEQUENCE权限)
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 —— 每次加几个
START WITH 1 —— 从1开始计数
NOMAXVALUE —— 不设置最大值
NOCYCLE —— 一直累加,不循环
CACHE 10;
只要定义了emp_sequence,你就可以用使CURRVAL,NEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值,然后返回 sequence 值
例如:
emp_sequence.CURRVAL
emp_sequence.NEXTVAL
可以使用sequence的地方:
。 不包含子查询、snapshot、VIEW的 SELECT 语句
。INSERT语句的子查询中
。NSERT语句的VALUES中
。UPDATE 的 SET中
可以看如下例子:
INSERT INTO emp VALUES
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);
SELECT empseq.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示例:
可以影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
简单的Drop Sequence
DROP SEQUENCE order_seq;
minvalue 1
maxvalue 999999999999999999999999999
start with 4753914
increment by 1create sequence seq_2
minvalue 1
maxvalue 999999999999999999999999999
start with 4753914
increment by 1