1.创建一个TestTable表, CREATE TABLE TestTable ( ID NUMBER NOT NULL, NAME VARCHAR2(40) ) ; 2.创建一个序列(Sequence),命名为SEQ CREATE SEQUENCE "DUNCAN"."SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ; 3.创建触发器 create or replace TRIGGER Test_Trr BEFORE INSERT ON TestTable FOR EACH ROW BEGIN SELECT SEQ.NEXTVAL INTO:new.ID FROM sys.DUAL; END; 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’); 自增字段:表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,各字段的值) 2)如果在增加的同时,另一个字段也保存此ID值(如显示顺序号),代码如下, insert into 表名(自增ID字段名称,各字段名,顺序号字段名)values(自增ID对应的SEQUENCES名.NEXTVAL,各字段的值,自增ID对应的SEQUENCES名.Currval)