除了使用触发器之外,在Oracle中实现自动递增的其他方法是什么?
除了使用触发器之外,在Oracle中实现自动递增的其他方法是什么?
如果您不需要连续的数字,而只需要一个唯一的ID,您可以使用SYS_GUID()函数的默认值。例如:
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');
但是使用触发器更加 "透明"。
create sequence seq;
然后添加一个值
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
从12c开始,您可以使用标识列,明确表格和自增之间的链接;无需触发器或序列。语法如下:
create table <table_name> ( <column_name> generated as identity );
如果您不想使用“触发器”解决方案,您可以通过编程方法实现自动递增功能,使用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