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;
/