Каковы другие способы достижения автоинкремента в oracle, кроме использования триггеров?
Автоматический прирост в Oracle без использования триггера
Ответ 1
Насколько я помню из своих дней Oracle, вы не можете использовать столбцы Auto Increment без использования TRIGGER. Любые решения для создания столбца автоматического приращения включают TRIGGER и SEQUENCE (я предполагаю, что вы уже знаете это, следовательно, никакие триггерные замечания).
Ответ 2
Вы можете создавать и использовать последовательности оракулов. Синтаксис и подробности приведены в http://www.techonthenet.com/oracle/sequences.php
Также прочитайте статью http://rnyb2.blogspot.com/2006/02/potential-pitfall-with-oracle-sequence.html для понимания ограничений в отношении AUTONUMBER в других СУБД
Ответ 3
Если вам не нужны порядковые номера, а только уникальный идентификатор, вы можете использовать DEFAULT из SYS_GUID(). То есть:
CREATE TABLE xxx ( ID RAW(16) DEFAULT SYS_GUID() )
Ответ 4
Триггер для получения следующего значения из последовательности является наиболее распространенным способом достижения эквивалента 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');
Но использование триггера более "прозрачно".
Ответ 5
Создайте последовательность:
create sequence seq;
Затем, чтобы добавить значение
insert into table (id, other1, other2)
values (seq.nextval, 'hello', 'world');
Примечание. Ищите документы оракула для получения дополнительных опций о последовательностях (начальное значение, приращение,...)
Ответ 6
Из 12c вы можете использовать столбец идентификации, который явно указывает связь между таблицей и автоматическим приращением; нет необходимости в триггере или последовательности. Синтаксис:
create table <table_name> ( <column_name> generated as identity );
Ответ 7
В дополнение к, например, Ответ FerranB:
Вероятно, стоит упомянуть, что в отличие от того, как auto_incment работает в MySQL:
Ответ 8
Если вы действительно не хотите использовать "основанное на триггерах" решение, вы можете достичь функциональности автоматического увеличения с помощью программного подхода, получив значение ключа автоматического приращения с помощью метода 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
Ответ 9
SELECT max (id) + 1
FROM table