oracle 视图 自增列,Oracle实现自增列

首先创建一个序列(sequence),实现自增

-- Create sequence

create sequence t_user_seq

minvalue 1 -- 最小值:1

nomaxvalue -- 没有最大值

start with 1 -- 从1开始

increment by 1 --每次递增1

nocache --不使用缓存 (也可设置为 cache n, 区别见本文最后附注部分)

order;

创建触发器,在触发器中使用之前创建好的sequence :t_user_seq

-- Create trigger

create or replace trigger t_user_trigger

-- 在往表t_user中插入新数据之前触发

before insert on t_user

for each row

begin

select  t_user_seq.nextval

-- 自增字段: user_id

into:new.user_id

from sys.dual ;

end;

最后执行几条insert 语句测试一下。

附注:

如果指定CACHE值,Oracle就可以预先在内存里面放置一些Sequence,这样存取的快些。cache里面的取完后,Oracle自动再取一组到cache。使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的Sequence就会丢失。举个例子:比如你的sequence中cache 100,那当你sequence取到90时突然断电,那么在你重启数据库后,sequence的值将从101开始。

如果指定NOCACHE值,Oracle就不会预先在内存里面存放Sequence,当然这也就可以避免数据库不正常down掉的sequence丢失。不过会产生一些问题:创建nocache   sequence在高并发访问时,容易导致row cache lock等待事件,主要原因是每次获取nextval时都需要修改rowcache中的字典信息。使用nocache  sequence,还会导致如下问题:

由于每次修改字典信息都需要commit,可能导致log file sync等待,nocache sequence在RAC环境下,会对基于sequence生成的列创建的索引造成实例间大量索引块争用

基于以上问题,避免创建nocache sequence。

再来看看sequence相关保护机制:

row cache lock:在调用sequence.nextval情况下需要修改数据字典时发生,对应row cache lock事件

SQ lock:在内存缓存(并非rowcache)上获取sequence.nextval时发生,对应enq:SQ-contention事件

SV lock:RAC环境下获取cache+order属性的sequence.nextval时发生,对应DFS lock handle事件

什么情况下使用cache什么时间上使用nocache?

我个人感觉应该尽量使用cache,因为现在的数据库很多都是在高并发的情况下运行的,首先这样可以搞性能,并且也不会产生row cache lock等待事件。可能有些人会担心数据库不正常的down掉会产生序列号间断,但这也是很少的情况。当然如果你的业务要求是绝不能产生间断的序列号,那就要使用nochache了。

参考:http://blog.csdn.net/duanning397/article/details/7670302

参与评论 您还未登录,请先 登录 后发表或查看评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值