Orcle 主键自增(序列sequence、触发器trigger、主键primary)

设置主键:
1、建表时指定primary key:
create table test(id number(6) primary key, name varchar2(20) );
2、如果表已经建好,想要增加主键约束:
alter table test add constraint pk_id primary key(id);

alter table pk_id add primary key (id);


id自增功能:
首先建立一个序列(每次查询会自动增加值的绝不重复的对象,比如每次加1或加10)
语法:  CREATE SEQUENCE 序列名  [INCREMENT BY n]     --每次加几  [START WITH n]         --序列从几开始  [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] --最小值、最大值的限制  比如CREATE SEQUENCE s_test start with 1 increment by 1;   --就是建立了额一个从1开始每次加1的序列。 访问序列时,用  序列名称.nextval的语法。

 

序列的两种使用方法: 
1.创建sequence就可以(不用触发器) 
create   sequence   seq_name 
minvalue   1 
maxvalue   999999999999999999 
start   with   1 
increment   by   1 
cache   20; 
可以直接在插入时调用seq_name.nextval,实现字段自增(前提是表和序列已经建好); 
如insert   into   table_name(proid)   values(seq_name.nextval); 

2.也可以创建触发器(同时要创建sequence): 
create   or   replace   trigger   trg_name 
before   insert   on   table_name 
for   each   row 
begin 
select   seq_name.nextval   into   :new.proid   from   dual; 
end; 
采用触发器,每当有数据插入时,触发器自动修改id值为序列的新值,这样就完全实现自增id功能了。既然对id字段使用了sequence,且建立了对应的trigger,在处理的时候就不要再出现id对应的信息了,触发器会根据取得的sequence自动添加id字段的。
insert   into   test(name)   values('张三');


例1:oracle创建表时设置自增主键
1、建用户数据表
 drop table dectuser;
create table dectuser(
userid integer primary key, /*主键,自动增加*/
name varchar2(20),
sex varchar2(2)
);
2、创建自动增长序列
drop sequence dectuser_tb_seq;
create sequence dectuser_tb_seq 
minvalue 1 
maxvalue 99999999
increment by 1
start with 1; /*步长为1*/
3、创建触发器
create or replace trigger dectuser_tb_tri
before insert on dectuser /*触发条件:当向表dectuser执行插入操作时触发此触发器*/
for each row/*对每一行都检测是否触发*/
begin/*触发器开始*/ 
select dectuser_tb_seq.nextval into :new.userid from dual;  /*触发器主题内容,即触发后执行的动作,在此是取得序列dectuser_tb_seq的下一个值插入到表dectuser中的userid字段中*/
end; /*退出sqlplus行编辑*/
4、提交
commit; 
现在就完成了自增主键的设定,搞定!可以检测一下。
insert into dectuser(name,sex) values ('wang','女');

总的来说,通过在insert操作之前,添加一个触发器,将序列的值放到了将要插入的数据的ID中。
所以,需要 建表->建序列->建触发器 这样一个过程。我觉得有几个要注意的
一是主键类型为 INT型比较好。
二是触发器主题内容中,select...into 后面的冒号不能掉了。

需要注意的是不同的表共用同一个序列时,由于序列的是一个,所以不同表的自增会不连续,另外和SqlServer不同的还有,设置了这个以后主键是可以自己维护的,只有当主键为空时才会调用触发器,由序列产生自增值。

另外,pd自动生成的oracle的sql语句是包含双引号的,可能导致oracle权限的错误,错误提示是:ORA-00904:invalid identifier。


例2: oracle创建表时设置自增主键
将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现)

----创建表
Create  table  t_user(
Id number(6),userid varchar2(20),loginpassword varchar2(20),isdisable number(6)
);

----创建序列
create sequence user_seq
increment by 1  
start with 1
nomaxvalue
nominvalue
nocache

----创建触发器
create or  replace trigger tr_user
before insert on t_popedom_user
for each row
begin
select user_seq.nextval into :new.id from dual;
end;

----测试
insert into t_popedom_user(userid,loginpassword, isdisable)
values('ffll','liudddyujj', 0);
insert into t_popedom_user(userid,loginpassword, isdisable)
values('dddd','zhang', 0)
select * from t_user;
就可以看出结果。

***********************************************************************
对sequence说明:
increment by :用于指定序列增量(默认值:1),如果指定的是正整数,则序列号自动递增,如果指定的是负数,则自动递减。
start with :用于指定序列生成器生成的第一个序列号,当序列号顺序递增时默认值为序列号的最小值 当序列号顺序递减时默认值为序列号的最大值。
Maxvalue:用于指定序列生成器可以生成的组大序列号(必须大于或等于start with,并且必须大于minvalue),默认为nomaxvalue。
Minvalue:用于指定序列生成器可以生成的最小序列号(必须小于或等于starr with,并且必须小于maxvalue),默认值为nominvalue。
Cycle:用于指定在达到序列的最大值或最小值之后是否继续生成序列号,默认为nocycle。
Cache:用于指定在内存中可以预分配的序列号个数(默认值:20)。
在sequence中应注意:
1、 第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。
2、 如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

你可能感兴趣的:(oracle,数据库,cache,user,insert,sqlserver)