论坛首页 编程语言技术论坛

oracle 实现自增auto_increament

浏览 3930 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-09-19  

在mysql中,实现字段自增,只用给他设置为auto_increase就ok了

 

这是简单的傻子啊(但是多数据库共享,分布式计算就不适用了,呵呵)

 

在oracle中没有这样便捷的功能,所以只能用sequence加trigger来解决这个问题

 

以下是一个Demo:

    创建sequence

-- create sequence of id of the table sql_template_set 
create sequence sql_template_id_seq
increment by 1
start with 60
nomaxvalue
nominvalue
nocache;

 

    创建表 sql_template_set (id为主键,并且为自增字段)

    create table SQL_TEMPLATE_SET

(
  SENTENCE    VARCHAR2(2000),
  TEMPLATESQL VARCHAR2(300),
  TABLEIDS    VARCHAR2(100),
  ID          NUMBER(6) not null
)
alter table SQL_TEMPLATE_SET
  add constraint TEMPLATE_ID primary key (ID)

 

    创建触发器,在insert数据之前,添加id的值

    -- 创建自增触发器

create or replace trigger sql_template_con_tri
before insert on sql_template_set for each row
begin
       -- 设置sql主键自增
      select sql_template_id_seq.nextval into :new.id from dual;
end;

 

    完毕,现在可以测试一下下

     -- 测试表trigger

insert into sql_template_set(sentence,templatesql,tableids) values('dirktest','dirktest','dirktest') 
commit;
 

    结果主键id就从60开始,每加条数据递增1

 

   发表时间:2012-09-19  
序列的嘛
0 请登录后投票
   发表时间:2012-09-20  
问题是
还是需要一次查询才能拿回主键  而且这次查询怎么写呢?
2 请登录后投票
   发表时间:2012-09-20   最后修改:2012-09-20
jinnianshilongnian 写道
问题是
还是需要一次查询才能拿回主键  而且这次查询怎么写呢?


确实有这个问题。

可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。

但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴
0 请登录后投票
   发表时间:2012-09-20  
insert into sql_template_set(id,sentence,templatesql,tableids) values(sql_template_id_seq.nextval,'dirktest','dirktest','dirktest')  
这么写好像也可以。。。

 
0 请登录后投票
   发表时间:2012-09-20  
blackproof 写道
jinnianshilongnian 写道
问题是
还是需要一次查询才能拿回主键  而且这次查询怎么写呢?


确实有这个问题。

可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。

但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴


还有几点:
1、比如mysql的自增 当人工赋值了 那么自增是不起作用的;
2、如果触发器全局通用 那非常好, 但现在不是,即实际成本高于直接写seq.nextval
0 请登录后投票
   发表时间:2012-09-20  
tenderuser 写道
insert into sql_template_set(id,sentence,templatesql,tableids) values(sql_template_id_seq.nextval,'dirktest','dirktest','dirktest')  
这么写好像也可以。。。

 



嗯,是滴

可是这里的目的是模仿auto_increment的功能,你这样还要知道这个sequence,不过的确少了trigger的开销,滴。
0 请登录后投票
   发表时间:2012-09-20  
jinnianshilongnian 写道
blackproof 写道
jinnianshilongnian 写道
问题是
还是需要一次查询才能拿回主键  而且这次查询怎么写呢?


确实有这个问题。

可是我觉得要是非要让嵌入式语言(如java)知道主键的话,或是非要根据主键查询可以用类似java的uuid,但是这样就不是递增的了,只能做到数据库(包括分布式情况)中表的唯一性。

但是大多情况,至少在做数据统计的时候的大多数情况下,id都无需知道滴,还是能用这个滴


还有几点:
1、比如mysql的自增 当人工赋值了 那么自增是不起作用的;
2、如果触发器全局通用 那非常好, 但现在不是,即实际成本高于直接写seq.nextval


嗯,这我倒是没想到,可能也是应为现在的业务没碰到
的确应该在trigger中判断一下:new.id is null or :new.id = '',然后再赋值。

至于触发器全局可是使用到全局中滴,只要加实例名就可以了滴。
还有至于trigger的成本,的确是高了些。

其实也想过,直接用过程,在过程里,生成id值,再插入。java那些语言就直接调用过程了。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics