首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

oracle中的ID号怎么实现自增长

2012-12-16 
oracle中的ID号如何实现自增长RT(最好给个例子)[最优解释]使用sequence--创建sequenceCREATE SEQUENCE emp

oracle中的ID号如何实现自增长
RT  (最好给个例子)
[最优解释]
使用sequence

--创建sequence
CREATE SEQUENCE emp_sequence  
    INCREMENT BY 1  -- 每次加几个  
    START WITH 1    -- 从1开始计数  
    NOMAXVALUE      -- 不设置最大值  
    NOCYCLE         -- 一直累加,不循环  
    CACHE 10;  

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL  
 CURRVAL=返回 sequence的当前值  
 NEXTVAL=增加sequence的值,然后返回 sequence 值

INSERT INTO emp VALUES   
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);  

SELECT empseq.currval     FROM DUAL;  
[其他解释]
1:SEQUENCE
2:触发器实现,参考我的博客:
http://blog.csdn.net/java3344520/archive/2009/11/30/4907591.aspx
[其他解释]
1:SEQUENCE(手动调用,先初始化)
     
2:触发器实现(其实就是使用序列)
[其他解释]
哦,这个啊,网上一搜一大把。呵呵,看看小弟的文章吧。http://hi.baidu.com/%B3%F3%C5%AEyuyu/blog/item/1761ea55bcc89d153b293544.html原来用的时候,转自csdn的。
[其他解释]
总结一下,oracle实现自增长的途径:
1、使用sequence;
  创建:create sequence id_seq start with 1 increment by 1;
  引用:select id_seq.nextval from dual;
  在该表上可以创建一个触发器来引用,并自动插入相应的表
2、使用自建表加select * from update来维护,如果每天都序列号都要复位,可以用这种方式来实现。
  建一张保存序列号的表,如tabseq(id number),并插入初始值0;
  使用锁定来实现串行:select * from tabseq for update;
  取得当前表的id值加1,作为下一个id返回
  更新回表并提交。如果要实现每天复位,可以增加一个日期字段,然后和当前日期进行比较决定是否复位。

[其他解释]
使用序列来实现自动增长,不过需要自己取值sq.nextval来实现。
[其他解释]
  
   序列+触发器实现。

创建SEQUENCE   
  create   sequence   s_country_id   increment   by   1   start   with   1   maxvalue   999999999;   

  创建一个基于该表的before   insert   触发器,在触发器中使用该SEQUENCE   
  create   or   replace   trigger   bef_ins_t_country_define   
  before   insert   on   t_country_define   
  referencing   old   as   old   new   as   new   for   each   row   
  begin   
  new.country_id=s_country_id.nextval;   
  end;   

[其他解释]
触发器:
create or replace

  TRIGGER Test_Trr


  BEFORE INSERT ON Table1  --在‘Table1’上创建触发器

  FOR EACH ROW

  BEGIN

  SELECT SEQ1.NEXTVAL INTO :new.ID FROM sys.DUAL; --‘nextval=增加sequence的值,然后返回 sequence 值再将该值插入到ID中’

  END;
[其他解释]


--创建sequence
create sequence seq_on_test
increment by 1
start with 1
nomaxvalue
nocycle
nocache;

--建表
drop table test;
create table test(
    ID  integer
    ,stu_name nvarchar2(4)
    ,stu_age number
);

--插入数据
insert into test values(seq_on_test.nextval,'张三',24);
insert into test values(seq_on_test.nextval,'李四',25);

select * from test;

--结果
/*
1张三24
2李四25
*/

--seq的两个方法
select seq_on_test.currval from dual;
select seq_on_test.nextval from dual;

--结果
/*
2
3
*/

[其他解释]
1楼的回答已经很完美了
[其他解释]
创建SEQUENCE.调用此SEQUENCE.NEXTVAL即可
[其他解释]
楼上的回答都对!
[其他解释]
除了sequence外 其他方法
学习了
[其他解释]
SQL> select * from v$version;

BANNER
----------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

SQL> create sequence seq_t
  2  increment by 1
  3  start with 1
  4  nomaxvalue
  5  nocycle
  6  nocache
  7  /

序列已创建。

SQL> select seq_t.currval from dual;
select seq_t.currval from dual
       *
第 1 行出现错误:
ORA-08002: sequence SEQ_T.CURRVAL is not yet defined in this session


SQL> select seq_t.nextval from dual;

   NEXTVAL
----------
         1

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         1

SQL> drop table t;
drop table t
           *
第 1 行出现错误:
ORA-00942: table or view does not exist


SQL> create table t(id int,col_01 varchar(30));

表已创建。

SQL> insert into t values(seq_t.nextval,'a');

已创建 1 行。

SQL> insert into t values(seq_t.nextval,'b');



已创建 1 行。

SQL> commit;

提交完成。

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         3

SQL> select * from t;

        ID COL_01
---------- ------------------------------
         2 a
         3 b

SQL> alter system flush shared_pool;

系统已更改。

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         3

SQL> insert into t values(seq_t.nextval,'c');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

        ID COL_01
---------- ------------------------------
         2 a
         3 b
         4 c


[其他解释]

下面可以看到 alter system flush shared_pool 会对 cache 的 sequence 产生影响。

SQL> alter sequence seq_t cache 20;

序列已更改。

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         4

SQL> alter system flush shared_pool;

系统已更改。

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         4

SQL> alter system flush shared_pool;

系统已更改。

SQL> select seq_t.currval from dual;

   CURRVAL
----------
         4

SQL> exit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开

C:\Documents and Settings\kxning>sqlplus sys/oracle@as4 as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 4月 11 11:16:04 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> select seq_t.currval from dual;
select seq_t.currval from dual
                          *
第 1 行出现错误:
ORA-08002: sequence SEQ_T.CURRVAL is not yet defined in this session


SQL> select seq_t.nextval from dual;

   NEXTVAL
----------
         5

SQL> select seq_t.currval from dual;



   CURRVAL
----------
         5

SQL> alter system flush shared_pool;

系统已更改。

SQL> select seq_t.nextval from dual;

   NEXTVAL
----------
        25

SQL>



[其他解释]
前面几位给的例子太长了吧..简单点啊
[其他解释]
oracle没必要设置自增长字段啊,不是本身自带一个自增长的rownum吗,通过rownum查找唯一行是一样的

热点排行