设置主键:
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防止这种情况。