Oracle序列
2017-10-08 11:03
197 查看
序列是Oracle提供的用于生成一系列唯一数字的数据库对象。序列会自动生成顺序递增的序列号,以实现自动提供唯一的主键值。序列可以在多用户并发环境中使用,并且可以为所有用户生成不重复的顺序数字,而不需要任何额外的I/O开销。
1、创建序列
序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。用户在自己的模式中创建序列时,必须具有CREATE SEQUENCE系统权限;如果要在其他模式中创建序列,必须具有CREATE SEQUENCE系统权限。
使用CREATE SEQUENCE语句创建序列的语法如下:
seq_name:创建序列名称。
increment:该子句是可选的,表示序列的增量。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。默认值是1。
minvalue:可选的子句,决定序列生成的最小值。
maxvalue:可选的子句,决定序列生成的最大值。
start:可选的子句,指定序列的开始位置。默认情况下,递增序列的起始值为minvalue,递减序列的起始值为maxvalue。
cache:可选的子句,决定是否产生序号预分配,并存储在内存中。
cycle:可选的子句,当序列达到最大值或最小值时,可以复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或最大值。如果使用nocycle,那么在序列达到其最大值后最小值之后,如果试图再获取下一个值将返回一个错误。
order:可选的子句,可以保证生成的序列值是按照顺序产生的。例如,order可以保证第一个请求得到的数为1,第二个请求到的数为2,以此类推;而noorder只保证序列值得唯一性,不保证产生序列值得顺序。
【实例】在SCOTT模式下,创建一个序列STU_SEQ。
2、使用序列
创建STUDENT_INFO(学生信息)表,用于实例的操作使用。
【实例】使用序列STU_SEQ为STUDENT_INFO(学生信息)表的新记录提供学生编号。
【实例】使用伪列CURRVAL查询当前序列号。
实际上,在为表生成主键值时,通常是为表创建一个行级触发器,然后在触发器主体中使用序列值替换用户提供的值。
【实例】创建一个行级触发器,该触发器在STUDENT_INFO(学生信息)表插入数据时被触发,并且在该触发器的主体中实现设置STUDENT_INFO(学生信息)表STU_ID列的值。
3、修改序列
使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能被修改外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重键该序列。
【实例】修改STU_SEQ的最大值为100000,序号增量为200,缓存值为100。
4、删除序列
【实例】使用DROP SEQUENCE语句删除STU_SEQ序列。
1、创建序列
序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。用户在自己的模式中创建序列时,必须具有CREATE SEQUENCE系统权限;如果要在其他模式中创建序列,必须具有CREATE SEQUENCE系统权限。
使用CREATE SEQUENCE语句创建序列的语法如下:
create sequence <seq_name> [start with n] [increment by n] [minvalue n | nomainvalue] [maxvalue n | nomaxvalue] [cache n | nocache] [cycle | nocycle] [order | noorder];
seq_name:创建序列名称。
increment:该子句是可选的,表示序列的增量。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。默认值是1。
minvalue:可选的子句,决定序列生成的最小值。
maxvalue:可选的子句,决定序列生成的最大值。
start:可选的子句,指定序列的开始位置。默认情况下,递增序列的起始值为minvalue,递减序列的起始值为maxvalue。
cache:可选的子句,决定是否产生序号预分配,并存储在内存中。
cycle:可选的子句,当序列达到最大值或最小值时,可以复位并继续下去。如果达到极限,生成的下一个数据将分别是最小值或最大值。如果使用nocycle,那么在序列达到其最大值后最小值之后,如果试图再获取下一个值将返回一个错误。
order:可选的子句,可以保证生成的序列值是按照顺序产生的。例如,order可以保证第一个请求得到的数为1,第二个请求到的数为2,以此类推;而noorder只保证序列值得唯一性,不保证产生序列值得顺序。
【实例】在SCOTT模式下,创建一个序列STU_SEQ。
CREATE SEQUENCE STU_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9999999999999
2、使用序列
创建STUDENT_INFO(学生信息)表,用于实例的操作使用。
--创建“学生信息”数据表 CREATE TABLE STUDENT_INFO ( STU_ID INT, STU_NAME VARCHAR2(8) );
【实例】使用序列STU_SEQ为STUDENT_INFO(学生信息)表的新记录提供学生编号。
INSERT INTO STUDENT_INFO(STU_ID,STU_NAME) VALUES(STU_SEQ.NEXTVAL,'张三');
【实例】使用伪列CURRVAL查询当前序列号。
SELECT STU_SEQ.CURRVAL FROM DUAL;
实际上,在为表生成主键值时,通常是为表创建一个行级触发器,然后在触发器主体中使用序列值替换用户提供的值。
【实例】创建一个行级触发器,该触发器在STUDENT_INFO(学生信息)表插入数据时被触发,并且在该触发器的主体中实现设置STUDENT_INFO(学生信息)表STU_ID列的值。
CREATE OR REPLACE TRIGGER TRI_INSERT_STU BEFORE INSERT ON STUDENT_INFO --关于STUDENT_INFO数据表的STU_ID,在插入STU_ID列之前,引起该触发器的运行 FOR EACH ROW --创建行级触发器 BEGIN SELECT STU_SEQ.NEXTVAL INTO :NEW.STU_ID FROM DUAL; --从序列中生成一个新的数值,赋值给当前插入行的STU_ID列 END; --测试 INSERT INTO STUDENT_INFO(STU_NAME) VALUES('李四');
3、修改序列
使用ALTER SEQUENCE语句可以对序列进行修改。需要注意,除了序列的起始值START WITH不能被修改外,其它可以设置序列的任何子句和参数都可以被修改。如果要修改序列的起始值,则必须先删除序列,然后重键该序列。
【实例】修改STU_SEQ的最大值为100000,序号增量为200,缓存值为100。
ALTER SEQUENCE STU_SEQ MAXVALUE 100000 INCREMENT BY 200 CACHE 100
4、删除序列
【实例】使用DROP SEQUENCE语句删除STU_SEQ序列。
DROP SEQUENCE STU_SEQ;
相关文章推荐
- 修改Oracle序列(sequence)的初始值(start with)
- Oracle序列(Sequence)创建、使用、修改、删除
- oracle 序列
- ORACLE序列的使用(oracle sequence)
- oracle序列应用
- MySQL实现类似Oracle的序列
- oracle使用序列和触发器使表主键自增长
- Oracle序列和主键映射
- oracle利用substr和instr函数截取角色序列的第一个角色
- 使用pl/sql在oracle中新建表和对应序列
- Oracle中序列的使用
- Oracle序列和触发器的使用
- Oracle 11g笔记——序列
- oracle 更改序列的初始值
- 【Oracle】利用触发器,序列实现id自增长
- Oracle序列
- oracle 简单序列 自增 实例
- Oracle创建序列,触发器使表自增
- Oracle序列(Sequence)创建、使用、修改、删除
- Oracle 创建序列,删除序列,得到序列的例子