Oracle没有自增字段这样的功能但是通过触发器(trigger)和序列(sequence)可以实现
先建一个测试表了
create table userlogin
(
id number() not null
name varchar() not null primary key
)
tablespace users
第一步创建SEQUENCE
create sequence userlogin_seq increment by start with minvalue maxvalue nocache order;
第二步创建一个基于该表的before insert 触发器在触发器中使用刚创建的SEQUENCE
create or replace trigger userlogin_trigger
before insert on userlogin
for each row
begin
select userlogin_seqnextval into:newid from sysdual ;
end;
第三步在userlogin表中测试
写个insert语句插入一条记录看ID字段自增了没自增则OK啦
oracle没有ORACLE自增字段这样的功能但是通过触发器(trigger)和序列(sequence)可以实现
先建一个测试表了
create table userlogin
(
id number() not null
name varchar() not null primary key
)
tablespace users
/
第一步创建SEQUENCE
create sequence userlogin_seq increment by start with minvalue maxvalue nocache order;
第二步创建一个基于该表的before insert 触发器在触发器中使用刚创建的SEQUENCE
create or replace trigger userlogin_trigger
before insert on userlogin
for each row
begin
select userlogin_seqnextval into:newid from sysdual ;
end;
/
第三步在userlogin表中测试
写个insert语句插入一条记录看ID字段自增了没自增则OK啦
Oracle序列知识
在oracle中sequence就是所谓的序列号每次取的时候它会自动增加一般用在需要按序列号排序的地方
Create Sequence
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限
CREATE SEQUENCE emp_sequence
INCREMENT BY 每次加几个
START WITH 从开始计数
NOMAXVALUE 不设置最大值
NOCYCLE 一直累加不循环
CACHE ;
一旦定义了emp_sequence你就可以用CURRVALNEXTVAL
CURRVAL=返回 sequence的当前值
NEXTVAL=增加sequence的值然后返回 sequence 值
比如
emp_sequenceCURRVAL
emp_sequenceNEXTVAL
可以使用sequence的地方
不包含子查询snapshotVIEW的 SELECT 语句
INSERT语句的子查询中
NSERT语句的VALUES中
UPDATE 的 SET中
可以看如下例子
INSERT INTO emp VALUES
(empseqnextval LEWIS CLERK SYSDATE NULL );
SELECT empseqcurrval 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防止这种情况
Alter Sequence
你或者是该sequence的owner或者有ALTER ANY SEQUENCE 权限才能改动sequence 可以alter除start至以外的所有sequence参数如果想要改变start值必须 drop sequence 再 recreate
Alter sequence 的例子
ALTER SEQUENCE emp_sequence
INCREMENT BY
MAXVALUE
CYCLE 到后从头开始
NOCACHE ;
影响Sequence的初始化参数
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目
可以很简单的Drop Sequence
DROP SEQUENCE order_seq;