Автоинкремент в Oracle без использования триггера - PullRequest
22 голосов
/ 25 ноября 2008

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

Ответы [ 9 ]

18 голосов
/ 25 ноября 2008

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

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

16 голосов
/ 25 ноября 2008

Если вам не нужны порядковые номера, а только уникальный идентификатор, вы можете использовать DEFAULT из SYS_GUID (). То есть:

CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
11 голосов
/ 25 ноября 2008

Триггер для получения следующего значения из последовательности является наиболее распространенным способом получения эквивалента 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');

Но использование триггера более "прозрачно".

3 голосов
/ 25 ноября 2008

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

2 голосов
/ 06 июля 2013

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

create table <table_name> ( <column_name> generated as identity );
2 голосов
/ 26 ноября 2008

Создать последовательность:

create sequence seq;

Затем добавить значение

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

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

0 голосов
/ 08 марта 2010

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

0 голосов
/ 05 февраля 2010

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

последовательности работают во всей базе данных, поэтому их можно использовать для нескольких таблиц, а значения уникальны для всей базы данных поэтому: усечение таблицы не сбрасывает функцию автоинкремента
0 голосов
/ 01 декабря 2008
SELECT max (id) + 1 
FROM   table
...