关于生成oracle自动编号的浅析
来源:互联网 发布:中国电力产能过剩数据 编辑:程序博客网 时间:2024/04/19 13:40
本文转载自:http://www.cnblogs.com/ysjxw/archive/2008/04/02/1135206.html
以下是正文内容:
在access中有自动编号的数据类型,MSSQL和MYSQL也都有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值,而oracle没有自动增长的数据类型,我们需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段,可以预见的是,有此功能,我们可以把数据从ACCESS、MSSQL或MYSQL迁移到oracle了!
create sequence type_id increment by 1 start with 1;
这句中,type_id为序列号的名称,每次增长为1,起始序号为1。
如果要删除序列,用drop sequence 序列名就可以了!!
序列可以保证多个用户对同一张表进行操作时生成唯一的整数,利用序列可以自动生成主关键字,序列只存在于数据字典中.
创建序列语法
CREATE SEQUENCE sequence[INCREMENT BY n][START WITH n][{MAXVALUE n|NOMAXVALUE}][{MINVALUE n|NOMINVALUE}][{CYCLE |NOCYCLE}][{CACHE n|NOCACHE}];
INCREMENT BY -- 指定步长
START WITH -- 指定初始值
MAXVALUE --定义序列生成的最大编号.默认的MAXVALUE就是NOMAXVALUE,对于递增序列为10^27,对于递减序列为-1
MINVALUE --定义序列的最小编号,默认的MINVALUE为NOMINVALUE,对于递增序列为1,递减序列为-10^26.
CYCLE --配置序列在达到界限值时重复编号
NOCYCLE --达到界限值时不重复编号,这是默认值,当你试图生成MAXVALUE+1时将返回异常.
CACHE --定义在内存中保留的序列编号块的大小,默认值为20.
NOCACHE --强制数据词典对于生成的每个序列编号进行更新,保证在生成的编号中没有空缺,但这样会降低性能.
生成一个序列
CREATE SEQUENCE dept_deptid_seqINCREAMENT BY 10START WITH 120MAXVALUE 9999NOCACHENOCYCLE;//如果是用来生成主键值的话,不要用CYCLE选项,而且命名序列时最好能体现它的潜在用途以便于理解.
确认序列
SELECT sequence_name,min_value,max_value,increament_by,last_numberFROM user_sequences;//如果你指定了NOCACHE选项,那么LAST_NUMBER列将显示下一可用的序列号.
使用NEXTVAL可以访问序列中的下一个编号,但问题常常出现在会话初始序列之前查询其当前序列号CURRVAL
CREATE SEQUENCE emp_seqNOMAXVALUENOCYCLE;
然后查询
SELECT emp_seq.currvalFROM dual;
将返回错误,问题就在于你视图引用CURRVAL之前,在你的会话中并没有使用NEXTVAL先初始化此序列.
SELECT emp_seq.nextvalFROM dual;
这样再查询CURRVAL就不会出错了.
使用序列
INSERT INTO departments(department_id,department_name,location_id)VALUES (dept_deptid_seq.NEXTVAL,'Support',2500);
对序列进行缓冲存储可以提高性能, 因为这样就不必对每个生成的编号都更新数据字典表, 只需要对每一组编号进行更新即可. 这样, 在我们查询NEXTVAL时就直接从缓冲中提取, 速度将快很多, 但是进行序列缓冲带来的负面影响就是当数据库被回滚时, 比如说系统崩溃,手动ROLLBACK数据时, 在缓冲中存储的序列值将会丢失, 这也就是为什么会出现空缺(GAPS), 如果生成序列时指定的是NOCACHE, 那么可以在USER_SEQUENCES表里查询下一个可用的序列号值, 这个查询并不会产生增加序列值的动作.
修改序列
ALTER SEQUENCE dept_deptid_seqINCREMENT BY 20MAXVALUE 999999NOCACHENOCYCLE;
规则:
>必须为序列的所有者或者拥有ALTER特权
>修改对于以后的序列号生效
>序列必须是被删除然后重新生成(使所有相关的对象失效,并且失去相应的关联)
>修改时还要满足些其他的验证条件,比如说新的MAXVALUE不可以比现在的序列号低
删除序列
DROP SEQUENCE dept_deptid_seq;
>必须要时序列的所有者或者有DROP ANY SEQUENCE的权限
补充:
关于Oracle的序列(Sequence)使用
序列是一数据库对象,利用它可生成唯一的整数。一般使用序列自动地生成主键值。对我们程序员来讲,精力时间有限,我们只学最有用的知识。大家请看:
1) 建立序列命令
CREATE SEQUENCE [user.]sequence_name[increment by n][start with n][maxvalue n | nomaxvalue][minvalue n | nominvalue];[NOCYCLE]
INCREMENT BY: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。
START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。
MAXVALUE:指定序列可生成的最大值。
NOMAXVALUE:为升序指定最大值为1027,为降序指定最大值为-1。
MINVALUE:指定序列的最小值。
NOMINVALUE:为升序指定最小值为1。为降序指定最小值为-1026。
NOCYCLE:一直累加,不循环
2) 更改序列命令
ALTERSEQUENCE [user.]sequence_name
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE ]
[MINVALUE n | NOMINVALUE]
修改序列可以:
修改未来序列值的增量。
设置或撤消最小值或最大值。
改变缓冲序列的数目。
指定序列号是否是有序。
注意:
1. 第一次NEXTVAL返回的是初始值
2. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create .
3) 删除序列命令
DROP SEQUENCE [user.]sequence_name;
用于从数据库中删除一序列。
4)牛刀小试
4.1)创建一个序列号的语句:
create sequence NCME_QUESTION_SEQminvalue 1maxvalue 999999999999start with 1increment by 1nocache;
4.2)SQL中取序列号的用法:
SELECT NCME_QUESTION_SEQ.nextval FROM dualSELECT NCME_QUESTION_SEQ.CURRVAL FROM dual
注意:在使用序列的时候,有时需要有用户名,就像这样:
insert into system.CONSERVATOR(CONSERVATORNAME,CONPASS,CONTRUENAME,CONSEX,CONID)values('JG','123456','000',0, system.CONID.nextval);
hibernate映射oracle自动增长ID
1.创建序列
create sequence empIDSeq nocycle maxvalue 9999999999 start with 1;
2. SQL调用序列
insert into table emp (empID, ..) values(empIDSeq.nextval, ..)
3.hibernate映射文件中调用
<id name="id" type="java.lang.Long" column="empID"> <generator class="sequence" > <param name="sequence"><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: 19.5px;">empIDSeq</span></param> </generator></id>
- 关于生成oracle自动编号的浅析
- Oracle自动生成编号的函数
- 关于oracle自动编号
- 自动生成编号的方法
- ORACLE存储过程自动生成编号
- 自动生成人才编号的存储过程
- 自动生成16位的单据编号
- ASP自动生成编号的方法
- Flex的DataGrid自动生成编号
- SQL生成按月的自动编号
- sql获取自动生成的ID编号
- LightSwitch中自动编号的生成
- 自动生成编号
- 自动生成编号
- 自动生成编号
- dbgrid自动生成编号
- 自动生成字母编号
- Oracle自动编号列的创建
- nasm使用小记
- EL,OGNL两种表达式的用法
- CEGUI中文输入的完美解决
- Eclipse C/C++和MinGW/Cygwin开发环境配置
- Window.Open在同一个标签页打开
- 关于生成oracle自动编号的浅析
- MapReduce初级案例
- STL双向链表之删除重复元素(list)
- uva10312 - Expression Bracketing 括号划分
- Viewpage GuideViewDemo
- Android 4.0设置Dialog点击屏幕不消失 .
- CSS2圆角效果
- 通过global_dbname和dbname访问数据库的不同
- jvm调优