Oracle自增字段的实际应用

  今天我们向大家介绍的是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,各字段的值)

2)如果在增加的同时,另一个字段也保存此ID值(如显示顺序号),代码如下,
insert into 表名(自增ID字段名称,各字段名,顺序号字段名)values(自增ID对应的SEQUENCES名.NEXTVAL,各字段的值,自增ID对应的SEQUENCES名.Currval)
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值