23

除了使用触发器之外,在 oracle 中实现自动增量的其他方法是什么?

4

9 回答 9

18

您可以创建和使用 oracle 序列。语法和详细信息位于 http://www.techonthenet.com/oracle/sequences.php

另请阅读文章 http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html 以了解其他 RDBMS 中关于 AUTONUMBER 的限制

于 2008-11-25T11:07:17.243 回答
16

如果您不需要序列号而只需要唯一 ID,则可以使用 SYS_GUID() 的默认值。IE:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
于 2008-11-25T11:53:37.943 回答
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 into mytable (id, data) values (myseq.nextval, 'x');

这可以隐藏在 API 包中,因此调用者不需要引用序列:

mytable_pkg.insert_row (p_data => 'x');

但是使用触发器更“透明”。

于 2008-11-25T13:09:56.323 回答
3

据我在 Oracle 时代的回忆,不使用 TRIGGER 就无法实现自动增量列。任何用于制作自动增量列的解决方案都涉及 TRIGGER 和 SEQUENCE(我假设您已经知道这一点,因此没有触发备注)。

于 2008-11-25T11:13:17.573 回答
3

创建一个序列:

create sequence seq;

然后添加一个值

insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');

注意:查找 oracle 文档以获取有关序列的更多选项(起始值、增量,...)

于 2008-11-25T22:58:43.047 回答
2

从 12c 开始,您可以使用标识列,它明确表和自动增量之间的链接;不需要触发器或序列。语法是:

create table <table_name> ( <column_name> generated as identity );
于 2013-07-05T23:24:36.143 回答
0

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

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

  • 于 2010-02-05T11:01:29.930 回答
    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

    于 2010-03-08T11:28:27.353 回答
    -8
    SELECT max (id) + 1 
    FROM   table
    
    于 2008-12-01T12:42:10.280 回答