今天我们向大家介绍的是Oracle自增字段,我们都知道Oracle与MS SQL是不相同的,默认是不存在自增列的,但是我们可以进行创建序列和触发器的方式来创建自增列字段,下面我就讲述下如何创建自增列字段(Oracle 11g版本)。
今天我们向大家介绍的是Oracle自增字段,我们都知道Oracle与MS SQL是不相同的,默认是不存在自增列的,但是我们可以进行创建序列和触发器的方式来创建自增列字段,下面我就讲述下如何创建自增列字段(Oracle 11g版本)。
1.创建一个TestTable表,
CREATE TABLE TestTable ( ID NUMBER NOT NULL, 用于Oracle自增列
NAME VARCHAR2(40) ) ;
2.创建一个序列(Sequence),命名为SEQ(建议用自带的可视化工具创建 ‘DUNCAN’是我登陆的用户名,不要全盘复制)。
CREATE SEQUENCE "DUNCAN"."SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER NOCYCLE ;
3.创建触发器
create or replace TRIGGER Test_Trr BEFORE INSERT ON TestTable 在‘TestTable’上创建触发器
FOR EACH ROW BEGIN SELECT SEQ.NEXTVAL INTO :new.ID FROM sys.DUAL; ‘nextval=增加sequence的值,然后返回 sequence 值再将该值插入到ID中’
END; 好了,TestTable表的Oracle自增列就创建好了,同仁们插入一条数据试试吧!
oracle主键自增及存储过程的实现
要用到序列和触发器:
drop sequence users_tb_seq;
create sequence users_tb_seq minvalue 1 maxvalue 99999
increment by 1
start with 1;
create or replace trigger users_tb_tri
before insert on users
for each row
begin
select users_tb_seq.nextval into :new.user_id from dual;
end;
/
commit;
插入测试:(用到存储过程)
SET SERVEROUTPUT ON
create or replace procedure insertUser(
u_name in varchar2,
u_pass in varchar2,
u_per in number,
u_email in varchar2
) as
begin
insert into users(user_name,user_pass,user_per,user_email)
values(u_name,u_pass,u_per,u_email);
exception
when dup_val_on_index then
dbms_output.put_line(‘重复的用户编号’);
when rowtype_mismatch then
dbms_output.put_line(‘输入的字符类型不匹配’);
when others then
dbms_output.put_line(‘发生其他错误’);
end insertUser;
执行一下:
execute insertUser(‘xhot’,'42000′,1,’xhot@maoegg.com’);
Oracle插入数据时获取自增ID
自增字段:
表atable(id,a) id需要自增 首先建立一个序列:
create sequence seq_atable minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache
有二种方式使用自增字段:
使用序列+触发器实现自增,插入语句不需要管自增字段
如:create or replace trigger trg_atable before insert on atable for each row begin select seq_atable.nextval into :new.id from dual; end;
插入数据:insert into atable(a) values('test');
注:我创建了sequence 和trigger :,之后在procedure中插入数据,插入的时候没有管ID字段,在应用中,使用了hibernate,虽然hibernate在增加记录的时候也会处理ID,但是添加记录之后,查询记录发现,ID还是根据序列和触发器的规则设置的
仅使用序列,需要在插入数据时,自增字段插入序列下一个值
如:insert into atable(id,a) values(seq_atable.nextval,'test');
三、返回刚插入记录的自增字段值
如上面的例子,我们插入一条记录后,我想马上返回刚插入的记录的ID号,我该怎么处理呢?
首先要解决自增字段的问题,上面的二种方法哪种更适合这种用法呢? 建议使用第二种自增序列,否则处理起这个问题来比较麻烦。
使用自增字段的第二种方法,在插入一条记录后马上执行一下下面的语句即返回当前插入数据的ID。
$query="select seq_atable.currval from dual";
seq_atable.currval 的值只有在同一次会话中,发生seq_atable.nextval后有效:) 所以不会存在取错值的问题。
1.增加触发器的原因
1)手工增加记录时,自动产生ID,如果手工输入ID,则不用增加触发器。
2)程序增加记录时,不用考虑自增ID,即代码中不用包括对应的内容。
2.用程序增加数据时,可以不用触发器,但需要单独指定自增ID的代码
1)insert into 表名(自增ID字段名称,各字段名)values(自增ID对应的SEQUENCES名.NEXTVAL,各字段的值)