Oracle sequence介绍:创建自增字段方法
sequence的用法
ORACLE SEQUENCE用法在oracle中sequence就是序号,每次取的时候它会自动增加。
sequence与表没有关系。
1、Create Sequence首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
创建语句如下:CREATE SEQUENCE seqTestINCREMENT BY1-- 每次加几个START WITH1-- 从1开始计数NOMAXvalue -- 不设置最大值NOCYCLE -- 一直累加,不循环CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE2、得到Sequence值定义好sequence后,你就可以用currVal,nextVal取得值。
CurrVal:返回sequence的当前值NextVal:增加sequence的值,然后返回增加后sequence值得到值语句如下:SELECT Sequence名称.CurrVal FROM DUAL;如得到上边创建Sequence值的语句为:select seqtest.currval from dual在Sql语句中可以使用sequence的地方:- 不包含子查询、snapshot、VIEW的SELECT 语句- INSERT语句的子查询中- INSERT语句的values中- UPDATE 的SET中如在插入语句中insert into表名(id,name)values(seqtest.Nextval,'sequence 插入测试');注:- 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。
CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。
Oracle自动增长列的设置
SQL SERVER 和ACCESS 以及MYSQL 中,都有一种自增字段,通常被用来做主键或索引键,但是ORACLE 中,确并没有提供这种功能,但我们确经常需要这个功能,可以用以下方法解决,一,如果你不在集群环境下使用,并且用到了hibernate,那么可以用hibernate提供的产生自动增长类型主键的increment策略,如下在**.hbm.xml(hibernate映射文件)中配置如下<class name="com.xx.xx.Test" table="TEST"><id name="id" type="int" column="ID">//该句指定使用hibernate自带的increment策略生成主键<generator class="increment"/></id><property name="uname" type="ng.String" column="UNAME"/></class>这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可,注意,increment 实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键,increment不能在集群环境下使用,二,使用hibernate的sequence策略,在oracle中新建一个sequence,在hibernate中使用,如下在**.hbm.xml(hibernate映射文件)中配置如下<class name="com.xx.xx.Test" table="TEST"><id name="id" type="int" column="ID">//该句指定使用hibernate自带的sequence策略生成主键,TEST_SEQ是在数据库中新建的sequence的名称<generator class="sequence"><param name="sequence">TEST_SEQ</param></generator><property name="uname" type="ng.String" column="UNAME"/></class>这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可,三,以上两种方法都是通过hibernate实现的,下面给出ORACLE的一种实现方式1. 建立SEQUENCECREATE [ OR REPLACE ] SEQUENCE sequence_identity START WITH initial seedINCREMENT BY step MAXVALUE upper bound [NOMAXVALUE] NOCYCLE [empty] 2. 建立TRIGGERCREATE [ OR REPLACE ] TRIGGER trigger_identity BEFORE INSERT ON table_name FOR EACH ROW BEGIN SELECT sequence_identity.NEXTVALINTO :new.column_name FROM DUAL; END;这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可,。
oracle主键自动增长序列
select * from(select e.*,ROWNUM rnfrom (select * from emp order by empno) e)where rn between 1 and 10;select * from(select e.*,ROWNUM rnfrom (select * from emp order by empno) ewhere ROWNUM<=10)where rn>=1;首先,你要有一张表!CREA TE TABLE example(ID Number(4) NOT NULL PRIMARY KEY,NAME V ARCHAR(25),PHONE V ARCHAR(10),ADDRESS V ARCHAR(50));然后,你需要一个自定义的sequenceCREA TE SEQUENCE emp_sequenceINCREMENT BY 1 -- 每次加几个START WITH 1 -- 从1开始计数NOMAXV ALUE -- 不设置最大值NOCYCLE -- 一直累加,不循环NOCACHE -- 不建缓冲区以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,假如你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下假如你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但假如遭遇意外情况如当机了或Oracle死了,则下次取出的seq值将和上次的不连贯.(假如连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:CREA TE TRIGGER "触发器名称" BEFOREINSERT ON example FOR EACH ROW WHEN (new.id is null)beginselect emp_sequence.nextval into: new.id from dual;end;打完收工!下面你就试试插入数据吧!INSERT INTO example(Name,phone,address) V alues('Cao','56498543','Heibei');=============================================================ORACLE SEQUENCE的简单介绍(自增长字段)- -from:/BBS/user_file/2002-04-10/1018438701.htm在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
Oracle数据库中序列(SEQUENCE)的用法详解
在Oracle数据库中,什么是序列呢?它的用途是什么?序列(SEQUEN CE)其实是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。
其主要的用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
创建序列需要C REAT E SEQUEN CE系统权限。
序列的创建语法如下:CREATE SEQUEN CE 序列名 [INCREM ENT BY n] [STARTWITH n] [{MAXVAL UE/ MINVAL UE n|NOMAXV ALUE}] [] [{CACHEn|NOCACH E}];INCREM ENT BY 用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表序列的值是按照此步长递减的。
STARTWITH 定义序列的初始值(即产生的第一个值),默认为1。
MAXVAL UE 定义序列生成器能产生的最大值。
选项NOMA XVALU E是默认选项,代表没有最大值定义,这时对于递增序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。
MINVAL UE定义序列生成器能产生的最小值。
选项NOMA XVALU E是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。
CYCLE和NOCYC LE 表示当序列生成器的值达到限制值后是否循环。
C YCLE代表循环,NOCYCL E代表不循环。
如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。
如果不循环,达到限制值后,继续产生新值就会发生错误。
CACHE(缓冲)定义存放序列的内存块的大小,默认为20。
oracle数据库ID自增长--序列
oracle数据库ID⾃增长--序列什么是序列?在mysql中有⼀个主键⾃动增长的id,例如:uid number primary key auto_increment;在oracle中序列就是类似于主键⾃动增长,两者功能是⼀样的,只是叫法不同⽽已。
在oracle中想要实现id⾃动增长只能⽤序列来实现。
在oracle中,是将序列装⼊内存,可以提⾼访问效率。
1.)序列的创建 create sequence 序列名称 increment by n 每次增长多少 //系统默认值为1. start with n从⼏开始 //系统默认值为1. [maxvalue n最⼤值|nomaxvalue] //NoMaxValue:是系统对序列设置的默认值. 即指定升序序列的最⼤值为10的27次⽅.降序序列的最⼤值为-1. [minvalue n最⼩值|nominvalue] //同上 [cycle |nocycle 是否循环] [cache n缓存的数量|nocache] //指定要保留在内存中整数的个数.默认缓存的格式为20个. 可以缓存的整数最少为2个. 可以缓存的整数个数最多为:Cell(maximum_num—minimum_num)/ABS(increment_num). 注:Cell(序列的最⼤上限值—最⼩下限值,)/ABS(每次⾃增的增量).例如:create sequence person_pid_seq increment by 1 start with 1 maxvalue 1000 nocycle nocache; 可以直接创建,其他的选项全部是默认值。
例如:create sequence person_pid_seq;2.)序列的操作序列创建完成之后,所有的⾃动增长就都是由我们⾃⼰操作了,那么如果操作呢?提供了两种⽅式。
2.1 nextval:取得序列的下⼀个值 2.2 currval:取得当前序列的内容注意:currval 需要再nextval调⽤之后才能使⽤3.)序列的使⽤ insert into person values(person_pid_seq.nextval,'name,'adress');//⼀般是利⽤nextval,让id保持⼀直递增。
Oracle自增列创建方法
之前一直用mysql开发网站,最近换掉工作,碰到了oracle,发现了好多问题,oracle 主键不支持自增。
搜了一下才发现要但是通过触发器(trigger)和序列(sequence)可以实现。
一新建一个测试表-- Create tablecreate table SYTEST(syid NUMBER(10) not null,syname VARCHAR2(100) not null,sydate VARCHAR2(100))tablespace USERSpctfree 10initrans 1maxtrans 255storage(initial 64minextents 1maxextents unlimited);-- Add comments to the tablecomment on table SYTESTis '测试';-- Create/Recreate primary, unique and foreign key constraintsalter table SYTESTadd constraint SYID primary key (SYID)using indextablespace USERSpctfree 10initrans 2maxtrans 255storage(initial 64Kminextents 1maxextents unlimited);二: 创建SEQUENCEcreate sequence SYID increment by 1 start with 1 minvalue 1 maxvalue 9999999999999 nocache order;三:创建一个基于该表的before insert 触发器,在触发器中使用刚创建的SEQUENCEcreate or replace trigger SYIDtriggerbefore insert on SYTESTfor each rowbeginselect SYID.nextval into :new.SYID from dual;end ;下面往表里面插入数据测试就ok了使用 MVC框架,创建默认项目,第一直观感觉就是地址都是Rewrite过的。
Oracle使用序列实现自增列及重置序列
Oracle使⽤序列实现⾃增列及重置序列序列是oracle⽤来⽣产⼀组等间隔的数值。
序列是递增,⽽且连续的。
oracle主键没有⾃增类型,所以⼀般使⽤序列产⽣的值作为某张表的主键,实现主键⾃增。
序列的编号不是在插⼊记录的时候⾃动⽣成的,必须调⽤序列的⽅法来⽣成(⼀般调⽤nextval⽅法)。
我们也可以编写表的insert触发器来进⾃动⽣成。
创建语法:create sequence 序列名称[start with 初始量][increment by 递增量][maxvalue 最⼤值| nomaxvalue][minvalue 最⼩值| nominvalue][cycle | nocycle][cache 缓存个数| nocache];start with:⽣成第⼀个序列号,对于升序列,其默认值为序列最⼩值;对于降序序列,其默认值为序列的最⼤值。
increment by:⽤于指定序列号之间的间隔,其默认值为1,如果integer为正值,则⽣成的序列按升序排列,如果integer为负值,则⽣成的序列将按降序排列。
maxvalue:序列可以⽣成的最⼤值。
nomaxvalue:oracle将升序序列的最⼤值设为1027,将降序序列的最⼤值设为-1.这是默认选项。
minvalue:minvalue必须⼩于或等于start with的值,并且必须⼩于maxvalue的值。
nominvalue:oracle将升序的最⼩值设为1,或将降序序列的最⼩值设为-1026.这是默认值。
cycle:序列在达到最⼤值或最⼩值后,将继续从头开始⽣成值。
nocycle:序列在达到最⼤值或最⼩值后,将不能再继续⽣成值。
不写默认为nocycle这是默认选项。
cache:预先分配⼀组序列号,并将其保留在内存中,这样可以更快地访问序列号.当⽤完缓存中的所有序列号.oracle将⽣成另⼀组数值,并将其保留在缓存中。
nocache:不会加快访问速度⽽预先分配序列号,如果在创建序列时忽略了cache和nocache,orcale将默认缓存20个序列号。
oracle中sequence用法
oracle中sequence用法在Oracle数据库中,Sequence是一种用于生成唯一数字序列的对象。
它常用于自动生成主键值或其他需要唯一数字的列值。
下面将介绍Oracle中Sequence的用法。
使用CREATE SEQUENCE语句可以创建一个Sequence对象。
语法如下:CREATE SEQUENCE sequence_name[INCREMENT BY n][START WITH n][MINVALUE n][MAXVALUE n][CYCLE | NOCYCLE][CACHE n];其中,sequence_name是Sequence的名称;INCREMENT BY n表示每次增加的步长,默认为1;START WITH n表示Sequence的起始值,默认为1;MINVALUE n表示Sequence的最小值,默认为1;MAXVALUE n表示Sequence 的最大值,默认为大整数;CYCLE表示当达到MAXVALUE时是否循环使用Sequence,NOCYCLE表示不循环;CACHE n表示在内存中预分配的Sequence值的数量,默认为20。
创建完成后,可以通过使用NEXTVAL关键字获取Sequence的下一个值,该值可以用于插入数据表中的主键列或其他需要唯一数字的列。
语法如下:SELECT sequence_name.NEXTVALFROM dual;在使用Sequence时,也可以使用CURRVAL关键字获取当前Sequence的值,该值可以用于了解当前Sequence的状态。
语法如下:SELECT sequence_name.CURRVALFROM dual;需要注意的是,NEXTVAL和CURRVAL只能在SELECT语句中使用,并且必须在FROM子句中使用dual伪表。
此外,我们还可以使用ALTER SEQUENCE语句来修改Sequence的属性。
例如,可以使用以下语句来增加Sequence的步长:ALTER SEQUENCE sequence_nameINCREMENT BY n;或者可以使用以下语句重置Sequence的值:ALTER SEQUENCE sequence_nameINCREMENT BY nMINVALUE n;通过以上介绍,你应该对Oracle中Sequence的基本用法有了一定的了解。
oracle sequence 语法
Oracle Sequence 语法1. 什么是 Sequence?在 Oracle 数据库中,Sequence 是一种用于生成唯一数值的对象。
它可以被用于生成主键值或其他需要唯一数值的列。
Sequence 是一个被 Oracle 自动管理和维护的对象,它生成的数值是按照一定规则递增或递减的。
2. 创建 Sequence在 Oracle 中,可以使用CREATE SEQUENCE语句来创建一个 Sequence。
下面是创建 Sequence 的语法:CREATE SEQUENCE sequence_name[INCREMENT BY n][START WITH n][MAXVALUE n | NOMAXVALUE][MINVALUE n | NOMINVALUE][CYCLE | NOCYCLE][CACHE n | NOCACHE];•sequence_name是 Sequence 的名称,必须是唯一的。
•INCREMENT BY n指定每次递增或递减的步长,默认为 1。
•START WITH n指定 Sequence 的起始值,默认为 1。
•MAXVALUE n指定 Sequence 的最大值,如果超过最大值则会抛出错误,默认为 10^27 - 1。
•MINVALUE n指定 Sequence 的最小值,如果低于最小值则会抛出错误,默认为 1。
•CYCLE表示当 Sequence 达到最大值后重新循环,默认为不循环。
•CACHE n指定 Sequence 的缓存大小,默认为 20。
下面是一个创建 Sequence 的例子:CREATE SEQUENCE employee_sequenceINCREMENT BY 1START WITH 1MAXVALUE 1000MINVALUE 1NOCYCLECACHE 20;3. 使用 Sequence创建了 Sequence 后,可以使用NEXTVAL和CURRVAL函数来获取 Sequence 的下一个值和当前值。
在oracle数据库里创建自增ID字段的步骤
-- 为Insert操作创建触发器,无需在SQL语句里写NEXTVAL,名称为表名_INS_TRG CREATE OR REPLACE TRIGGER ADVICE_INS_TRG BEFORE INSERT ON ADVICE FOR EACH ROW WHEN(NEW.ID IS NULL) BEGIN SELECT ADVICE_ID_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL; END;
-- 创建表
CREATE TABLE ADVICE ( ID INT NOT NULL, ACTIVE INT DEFAULT 1 NOT NULL, TYPE INT NOT NULL, MSG VARCHAR2(512) NOT NULL, ADVICE VARCHAR2(4000) NOT NULL, PRIMARY KEY(ID), CONSTRAINT ADVICE_UNI UNIQUE(TYPE,MSG) )TABLESPACE MYDB;
这里整理了oracle中的三种级联操作其中oracle定义外健的时候可以定义级联删除但是没有级联修改的语法当然可以用触发器实现下面我们详细来看oracle数据库中的级联查询级联删除级联更新操作教程
在 oracle数据库里创建自增 ID字段的步骤
在oracle里使用自增ID字段的步骤比较繁琐,总结如下:
oracle中自动增长列
oracle中⾃动增长列
最近⽤vs2005+oracle开发,以前从没⽤过oracle,对oracle的了解也是甚少.今天,⽼⼤说要我建⼀个表,主键必须是⾃动增长的.于是我就⽤SQL Server的⽅法在那建.摸索了半天就是建不了,于是我就到⽹上搜...原来它是⽤序列来解决⾃动增长列的.....
下⾯则是整理出来的⼀些资料...
序列:
(1).可以为表中的列⾃动产⽣值.
(2).由⽤户创建数据库对象,并可由多个⽤户共享.
(3).⼀般⽤于主键或唯⼀列.
例⼦:
create sequence my_seq ---创建序列名
start with 1 ---从1开始
increment by 1 ---每次增长1
maxvalue 999999999 ---最⼤值
minvalue 1 ---最⼩值
cycle ---循环
cache ---缓存
order
从1开始,每次增长1,最⼤值为999999999,之后⼜循环从1开始.
SQL语句:
insert into mytable values(my_seq,'aaa')
insert into mytable values(my_seq,'bbb')
结果为:
1 aaa
2 bbb
调⽤:
select my_seq.nextval from mytable ---新值
select my_seq.currval from mytable ---当前值。
在ORACLE中建立自动增量字段的数据表
ID NUMBER (9) PRIMARY KEY, NAME VARCHAR2 (50) ) ;
--建立序列 CREATE SEQUENCE TEST_SQ;
--为数据表建立触发器,以设置自动增量字段的值 CREATE OR REPLACE TRIGGER TR_TEST BEFORE INSERT ON TEST FOR EACH ROW NTO :NEW.ID FROM DUAL; END;
--插入数据 INSERT INTO TEST(NAME)VALUES('AB'); INSERT INTO TEST(NAME)VALUES('CC');
请求出错错误代码400请尝试刷新页面重试
在 ORACLE中建立自动增量字段的数据表
在SQL SERVER中提供了自动增量字段,使用起来非常方便,但ORACLE中却需使用SEQUENCE 来产生自动增量的序列值,使用起来甚是麻烦,于是便设计了下面的触发器,使得在ORACLE中也 可以像SQL SERVER中一样的使用自动增量字段了。
oracle sequence 创建语句
Oracle Sequence 创建语句1. 什么是 Oracle Sequence?Oracle Database 中的序列(Sequence)是一种用于生成唯一数字值的数据库对象。
序列可以用于创建自增主键、生成唯一的标识符或者在需要连续数字值的地方使用。
2. 序列的创建语句在 Oracle Database 中,可以使用CREATE SEQUENCE语句来创建一个序列。
下面是创建序列的语法模板:CREATE SEQUENCE sequence_name[INCREMENT BY increment][START WITH start_value][MAXVALUE max_value | NOMAXVALUE][MINVALUE min_value | NOMINVALUE][CYCLE | NOCYCLE][CACHE cache_value | NOCACHE][ORDER | NOORDER];在上述语法中,各个参数的含义如下:•sequence_name:要创建的序列的名称。
•INCREMENT BY increment:指定序列的增量。
默认值为 1。
•START WITH start_value:指定序列的起始值。
默认值为 1。
•MAXVALUE max_value:指定序列的最大值。
默认值为 10^28-1。
•MINVALUE min_value:指定序列的最小值。
默认值为 1。
•CYCLE:如果达到序列的最大值后,是否循环到最小值。
默认为不循环。
•CACHE cache_value:指定序列的缓存大小。
默认值为 20。
•ORDER:保证生成的序列值的顺序。
默认为无顺序。
3. 示例以下示例演示了如何创建一个名为employee_id_seq的序列:CREATE SEQUENCE employee_id_seqINCREMENT BY 1START WITH 1MAXVALUE 999999999999999999999999999MINVALUE 1NOCYCLECACHE 20NOORDER;4. 序列的使用创建了序列后,可以通过NEXTVAL和CURRVAL两个伪列来获取序列的下一个值和当前值。
oracle sequence 语法
Oracle数据库中的SEQUENCE是一种用于生成序列号的对象,它提供了一种灵活且可预测的方式来生成唯一的ID。
使用SEQUENCE可以确保在数据库中插入新的记录时,主键值能够按照预定的顺序递增,并且不会与其他记录的主键值冲突。
下面是创建和使用SEQUENCE的基本语法:1. 创建SEQUENCE:```sqlCREATE SEQUENCE sequence_nameSTART WITH start_valueINCREMENT BY increment_value[MAXV ALUE max_value | NOMAXV ALUE][CYCLE | NOCYCLE][CACHE cache_size | NOCACHE];```* `sequence_name`:SEQUENCE的名称。
* `start_value`:SEQUENCE的起始值。
* `increment_value`:每次递增的步长。
* `max_value`:SEQUENCE的最大值。
如果指定了`MAXV ALUE`,当达到最大值时,SEQUENCE会自动循环回最小值。
* `NOMAXV ALUE`:不指定最大值。
SEQUENCE可以递增到非常大的值。
* `CYCLE`:当达到最大值时,SEQUENCE会循环回最小值。
* `NOCYCLE`:当达到最大值时,SEQUENCE会停止递增。
* `cache_size`:指定用于缓存SEQUENCE值的内存缓冲区的大小。
如果指定了`CACHE`,则可以提高查询性能,但会占用一定的内存空间。
* `NOCACHE`:不使用缓存。
每次获取SEQUENCE值时都会直接访问磁盘。
2. 使用SEQUENCE:在插入记录时,可以使用SEQUENCE生成的序列号作为主键值。
以下是在插入记录时使用SEQUENCE的示例:```sqlINSERT INTO table_name (column1, column2, ...)V ALUES (sequence_name.NEXTV AL, value2, value3, ...);```在上述示例中,`sequence_name.NEXTV AL`将获取SEQUENCE 的下一个值,并将其作为插入语句的一部分插入到表中。
oracle数据库中的表设置主键自增
2创建自动增长序列
CREATE SEQUENCE TestIncrease_Sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
oracle中没有自增字段可通过序列触发器间接实现cmd中sqlplus登录直接运行即可
oracle数 据 库 中 的 表 设 置 主 键 自 增
oracle中没有自增字段,可通过序列+触发器间接实现,cmd中sqlplus登录,直接运行即可。一般要经过一下几步: 1建立数据表
create table Test_Increase(
end;
4 提交
commit;
5 测试
反复执行如下语句:
insert into Test_Increase(Username) values('test')
6 查看插入结果:
userid username
1 test 2 test 3 test 4 test 5 test 6 test 7 test 8 test 9 test
NOMAXVALUE -- 不设置最大值
NOCYCLE
-- 一直累加,不循环
CACHE 10;
3创建触ห้องสมุดไป่ตู้器
CREATE TRIGGER Test_Increase BEFORE insert ON Test_Increase FOR EACH ROW begin select TestIncrease_Sequence.nextval into:erid from dual;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle sequence介绍:创建自增字段方法
先假设有这么一个表:
create table S_Depart (
DepartId INT not null,
DepartName NVARCHAR2(40) not null,
DepartOrder INT default0,
constraint PK_S_DEPART primary key (DepartId)
);
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
针对S_Depart创建的sequence如下:
create sequence S_S_DEPART
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by1
nocache;
一旦定义了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 S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'1234 5',1);
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 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY 10
MAXvalue 10000
CYCLE -- 到10000后从头开始
NOCACHE ;
影响Sequence的初始化参数:
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。
可以很简单的Drop Sequence
DROP SEQUENCE order_seq;
一个简单的例子:
create sequence SEQ_ID
minvalue1
maxvalue99999999
start with1
increment by1
nocache
order;
建解发器代码为:
create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number;
begin
IF :new.DepartId IS NULLor :new.DepartId=0THEN --DepartId是列名select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tri_test_id;
OK,上面的代码就可以实现自动递增的功能了。
-------------------------------------------------------------
自增长及触发器:
如何在Oracle 中实现类似自动增加ID 的功能?
整理编辑:China ASP
我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的
功能,我们可以通过采取以下的功能实现自动增加ID的功能
1.首先创建sequence
create sequence seqmax increment by 1
2.使用方法
select seqmax.nextval ID from dual
就得到了一个ID
如果把这个语句放在触发器中,就可以实现和ms sql 的自动增加ID相同的功能!
-------------------------------------------------------------------------
举例:
### 建表###
CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL, "TYPE"
NUMBER(3) NOT NULL, "BODY" VARCHAR2(100) NOT NULL, "HITS" NUMBER(
10) DEFAULT 0 NOT NULL, PRIMARY KEY("ID"))
TABLESPACE "TS_SPORTS"
### 建序列###
CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1 START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE
CACHE 50 NOORDER
### 建自动更新的触发器###
CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER" BEFORE INSERT
ON "SPORTS"."LINEUP"
FOR EACH ROW
DECLARE
next_id NUMBER;
BEGIN
--Get the next id number from the sequence
SELECT sports_lineup_id_seq.NEXTVAL
INTO next_id
FROM dual;
--Use the sequence number as the primary key
--for the record being inserted.
:new.id := next_id;
END;
### 建保护PRIMARY KEY 的触发器###
CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER" BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP"
FOR EACH ROW
BEGIN
RAISE_APPLICATION_ERROR (-20000,
'sports_lineup_id_update_trigger : Updates of the ID field'
||'are not allowed. ');。