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');

注意:查找关于序列的预言文档的更多选项(开始值,递增,...)

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

  • 序列在数据库范围内工作,因此它们可以用于多个表,并且值对于整个数据库是唯一的
  • 所以:截断表不会重置“自动增量”功能

  • SELECT max (id) + 1 
    FROM   table
    
    许可以下: CC-BY-SA归因
    不隶属于 StackOverflow
    scroll top