在Oracle中自动递增而不使用触发器
除了使用触发器之外,在oracle中实现自动增量的其他方法是什么?
据我记得,从我的Oracle时代,你不能实现自动递增列不使用TRIGGER。 任何解决scheme,使自动增量栏涉及TRIGGER和SEQUENCE(我假设你已经知道这一点,因此没有触发言论)。
你可以创build和使用oracle序列。 语法和细节在http://www.techonthenet.com/oracle/sequences.php
如果您不需要连续的数字,但只需要一个唯一的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中的工作方式相反:
如果您不想使用“基于触发器”的解决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