Oracle « autoincrement в oracle

Я уже понял что autoincrement не поддерживается в oracle, и что это чисто mysql-ная фишка.

Но есть же способ достич такого же результата малымы усилиями? просто автоинкремент идеально подходит именно в моей задаче. Прошу поделиться решением такой проблемы.

1 ответов


Автоинкрементного поля в Oracle нет, для этих целей используюся последовательности, использовать их несколько сложнее, но и возможностей они предоставляют намного больше.
Синтаксис CREATE SEQUENCE
Синтаксис CREATE TRIGGER

Используется следующим образом:


CREATE SEQUENCE название_последовательности
 START WITH     1000
 INCREMENT BY   1
 NOCACHE
 NOCYCLE
/


CREATE OR REPLACE TRIGGER название_таблицы before INSERT FOR each row
BEGIN
  SELECT название_последовательности.NEXTVAL
  INTO :new.product_id
  FROM dual;
END;
/
 

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


declare
p_id number;
begin
 SELECT SEQUENCE.NEXTVAL INTO id FROM dual;
 INSERT INTO TABLE (item_id) VALUES (p_id);
 commit;
end;
 

делал так )
при том что дополнительно не надо извлекать id и можно использовать дальше по коду) и понятно откуда ноги растут

У greyhard стоит commit в процедуре. Это может быть нормально для OLTP в некоторых случаях, но совершенно неприемлемо в OLAP-системах, где за один присест могут загружаться сотни тысяч записей. Все-таки, более универсальное решение — это триггер. А перед тем, как "рыть код" надо, все-таки, прочесть документацию.

Я везде использую такой код:


CREATE TABLE tab1 (
  tab1_id number PRIMARY KEY,
  tab1_val varchar2(100)
);

CREATE sequence tab1_seq start WITH 1 increment BY 1;

CREATE TRIGGER tab1_bi -- b.i. = "before insert"
before INSERT ON tab1 FOR each row
begin
  -- даем возможность заполнять поле произвольными значениями
  -- используем последовательность, только если передан NULL
  IF :new.tab1_id IS NULL then
    SELECT tab1_seq.NEXTVAL
    INTO :new.tab1_id
    FROM dual;
  end IF;
end;
/
 

В SQL стандарте это называется SEQUENCE.


Вообще, здесь есть подробная инструкция.