Oracle自增字段的应用

     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)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值