Oracle中不使用触发器的自动增量
-
11-07-2019 - |
题
oracle中除了使用触发器还有哪些方式实现自增?
解决方案
据我可以从我的Oracle天记得,你不能没有使用触发器实现自动递增列。任何在那里解决方案,使自动递增列涉及TRIGGER和SEQUENCE(我假设你已经知道这一点,因此没有触发的话)。
其他提示
您可以创建和使用Oracle序列。语法和细节是在 http://www.techonthenet.com/oracle/sequences.php
另外阅读文章 http://rnyb2.blogspot.com/2006/02 /potential-pitfall-with-oracle-sequence.html 了解与其他RDBMS对于自动编号的限制
如果您不需要序列号,但只有一个唯一的ID,你可以使用SYS_GUID的DEFAULT()。即:
CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
从序列获得的下一个值的触发是实现等效于自动增量的最常见的方式:
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');
但是,使用该触发是更 “透明的”。
创建的序列:
create sequence seq;
然后添加一个值
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
注意:查找关于序列的预言文档的更多选项(开始值,递增,...)
从图12C可以使用一个标识列一>,这使得明确的表,自动增加之间的联系;有没有必要为一个触发器或序列。语法是:
create table <table_name> ( <column_name> generated as identity );
除了例如FerranB 的回答:
可能值得一提的是,与 MySQL 中 auto_incement 的工作方式相反:
如果你真的不希望使用“基于触发器的”解决方案,可以实现用的程序化的方式自动递增的功能,获得与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