除了使用触发器之外,在oracle中实现自动增量的其他方法是什么?
答案 0 :(得分:18)
您可以创建和使用oracle序列。语法和详细信息位于 http://www.techonthenet.com/oracle/sequences.php
另读文章 http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html 了解其他RDBMS中有关AUTONUMBER的限制
答案 1 :(得分:16)
如果您不需要序列号但只需要唯一ID,则可以使用DEFAULT SYS_GUID()。即:
CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
答案 2 :(得分:11)
从序列中获取下一个值的触发器是实现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语句中的序列:
insert into mytable (id, data) values (myseq.nextval, 'x');
这可以隐藏在API包中,这样调用者就不需要引用序列:
mytable_pkg.insert_row (p_data => 'x');
但使用触发器更“透明”。
答案 3 :(得分:3)
据我所知,在Oracle时代,如果不使用TRIGGER,就无法实现自动增量列。任何有关自动增量列的解决方案都涉及TRIGGER和SEQUENCE(我假设您已经知道这一点,因此没有触发器备注)。
答案 4 :(得分:2)
创建序列:
create sequence seq;
然后添加值
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
注意:查找oracle文档以获取有关序列的更多选项(起始值,增量,...)
答案 5 :(得分:2)
从12c开始,你可以使用identity column,它明确了表和自动增量之间的联系;不需要触发器或序列。语法如下:
create table <table_name> ( <column_name> generated as identity );
答案 6 :(得分:0)
除了例如FerranB的回答:
值得一提的是,与auto_incement在MySQL中的工作原理相反:
答案 7 :(得分:0)
如果您不想使用“基于触发器”的解决方案,可以使用编程方法实现自动增量功能,使用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
答案 8 :(得分:-8)
SELECT max (id) + 1
FROM table