oracle 自动增长列 转自:http://www.blogjava.net/f6k66ve/archive/2010/03/04/314497.html SQL SERVER 和 ACCESS 以及 MYSQL 中, 都有一种自增字段, 通常被用来做主键或索引键, 但是 ORACLE 中,确并没有提供这种功能 ,但我们确经常需要这个功能,可以用以下方法解决, 一,如果你不在集群环境下使用,并且用到了hibernate,那么可以用hibernate提供的产生自动增长类型主键的increment策略,如下 在**.hbm.xml(hibernate映射文件)中配置如下 <class name="com.xx.xx.Test" table="TEST"> <id name="id" type="int" column="ID"> //该句指定使用hibernate自带的increment策略生成主键 <generator class="increment"/> </id> <property name="uname" type="java.lang.String" column="UNAME"/> </class> 这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可, 注意 ,increment 实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键,increment不能在集群环境下使用, 二,使用hibernate的sequence策略,在oracle中新建一个sequence,在hibernate中使用,如下 在**.hbm.xml(hibernate映射文件)中配置如下 <class name="com.xx.xx.Test" table="TEST"> <id name="id" type="int" column="ID"> //该句指定使用hibernate自带的sequence策略生成主键 ,TEST_SEQ是在数据库中新建的sequence的名称 <generator class="sequence"> <param name="sequence">TEST_SEQ</param> </generator> <property name="uname" type="java.lang.String" column="UNAME"/> </class> 这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可, 三,以上两种方法都是通过hibernate实现的,下面给出ORACLE的一种实现方式 1. 建立 SEQUENCE CREATE [ OR REPLACE ] SEQUENCE sequence_identity START WITH initial seed INCREMENT BY step MAXVALUE upper bound [NOMAXVALUE] NOCYCLE [empty] 2. 建立 TRIGGER CREATE [ OR REPLACE ] TRIGGER trigger_identity BEFORE INSERT ON table_name FOR EACH ROW BEGIN SELECT sequence_identity.NEXTVAL INTO :new.column_name FROM DUAL; END; 这样,在java文件中对表增加记录时,只需添加除ID外的其他字段,然后save即可, 2 转载:http://blog.youkuaiyun.com/am2004/archive/2005/12/15/553342.aspx 创建两个表,用来做测试: create table test (id int,name varchar2(10)); create table test1 (id int,name varchar2(10)); 创建sequence,用来得到自动增长值: create sequence For_test increment by 1 start with 1 maxvalue 999999999 nocycle cache 10; 测试: insert into test(id,name) values(For_test.Nextval,'Hello'); insert into test(id,name) values(For_test.Nextval,'World'); insert into test1(id,name) values(For_test.Nextval,'OK'); 查询测试数据: sql>select * from test; id name ---------------- 1 Hello 2 World sql>select * from test1; id name ---------------- 3 OK 说明: 从上面的例子中我们看到,我们创建一个sequence用来获得一个自动增长的值(这和sql server中的实现不同),但同时这个sequence可以同时用于多个数据表,并且为不同数据表获取的自动增长值是不重复的. 3 oracle: ORACLE没有自增长序列,因此可以用以下方法来实现 1.建立表格: CREATE TABLE Table1 ( CID NUMBER(8) NOT NULL, Others VARCHAR2(20) ); 2.建立从1开始的序列: CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 NOCACHE -- 不建缓冲区 3.建立触发器: CREATE OR REPLACE TRIGGER myTGR BEFORE INSERT ON Table1 FOR EACH ROW BEGIN SELECT myTGR.NextVAl INTO :new.CID FROM dual; END;