在Oracle中自动递增而不使用触发器

除了使用触发器之外,在oracle中实现自动增量的其他方法是什么?

据我记得,从我的Oracle时代,你不能实现自动递增列不使用TRIGGER。 任何解决scheme,使自动增量栏涉及TRIGGER和SEQUENCE(我假设你已经知道这一点,因此没有触发言论)。

如果您不需要连续的数字,但只需要一个唯一的ID,则可以使用SYS_GUID()的DEFAULT。 即:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() ) 

从序列中获取下一个值的触发器是实现与AUTOINCREMENT等效的最常用方法:

 create trigger mytable_trg before insert on mytable for each row when (new.id is null) begin select myseq.nextval into :new.id from dual; end; 

如果您控制插入,则不需要触发器 – 只需在插入语句中使用序列即可:

 insert into mytable (id, data) values (myseq.nextval, 'x'); 

这可以隐藏在一个API包内,以便调用者不需要引用序列:

 mytable_pkg.insert_row (p_data => 'x'); 

但是使用触发器更“透明”。

创build一个序列:

 create sequence seq; 

然后添加一个值

 insert into table (id, other1, other2) values (seq.nextval, 'hello', 'world'); 

注意:查找oracle文档以获得更多关于序列的选项(起始值,增量…)

从12c可以使用一个标识列 ,这使得明确的表和自动增量之间的联系; 不需要触发器或序列。 语法是:

 create table <table_name> ( <column_name> generated as identity ); 

除了FerranB的回答:
可能值得一提的是,与auto_incement在MySQL中的工作方式相反:

  • 序列在数据库范围内工作,因此它们可以用于多个表,并且这些值对于整个数据库是唯一的
  • 因此:截断表不会重置“自动增量”function
  • 如果您不想使用“基于触发器”的解决scheme,则可以使用编程方法实现自动递增function,使用getGeneratedKeys()方法获取自动递增键的值。

    这是一个供您考虑的代码片段:

     Statement stmt = null; ResultSet rs = null; stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE); stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTable"); stmt.executeUpdate("CREATE TABLE autoIncTable (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); stmt.executeUpdate("INSERT INTO autoIncTable (dataField) " + "values ('data field value')", Statement.RETURN_GENERATED_KEYS); int autoIncKeyFromApi = -1; rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // do stuff here } rs.close(); 

    来源: http : //forums.oracle.com/forums/thread.jspa?messageID=3368856

     SELECT max (id) + 1 FROM table