Автоматическое приращение в Oracle без использования триггера

каковы другие способы достижения автоматического приращения в oracle, кроме использования триггеров?

9 ответов


насколько я помню из моих дней Oracle, вы не можете достичь столбцов автоматического приращения без использования триггера. Любые решения, чтобы сделать столбец автоматического приращения, включают триггер и последовательность (я предполагаю, что вы уже знаете это, следовательно, никаких замечаний триггера).


вы можете создавать и использовать последовательности oracle. Синтаксис и данные в http://www.techonthenet.com/oracle/sequences.php

также прочитайте статью http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html чтобы понять ограничения в отношении AUTONUMBER в других СУБД


Если вам не нужны последовательные номера, а только уникальный идентификатор, вы можете использовать значение по умолчанию 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:

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

Примечание: искать в Oracle Docs для более вариантов о последовательности (начальное значение, приращение, ...)


от 12c вы можете использовать столбец Identity, что делает явной связь между таблицей и автоматическим приращением; нет необходимости в триггере или последовательности. Синтаксис такой:

create table <table_name> ( <column_name> generated as identity );

в дополнение к ответу, например, Ферранба:
Вероятно, стоит упомянуть, что, в отличие от того, как auto_incement работает в MySQL:

  • последовательности работают с базой данных, поэтому их можно использовать для нескольких таблиц, а значения уникальны для всей базы данных
  • поэтому: усечение таблицы не сбрасывает функцию " autoincrement

  • Если вы действительно не хотите использовать" триггерное " решение, вы можете достичь функции автоматического приращения с помощью программного подхода, получив значение ключа автоматического приращения с помощью 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