В Oracle нельзя сделать поле, автоматически увеличивающее свое значение напрямую, как например поле Identity в SQL Server. Поэтому для этих целей обычно используются последовательности (сиквенсы, sequences).
Конечно, сиквенсы не так удобны, но и имеют определенные преимущества. К примеру, сиквенс замечательно подходит для сквозных нумераций в нескольких таблицах.
Синтаксис создания последовательности выглядит так:
CREATE SEQUENCE имя
[START WITH начальное_значение]
[INCREMENT BY значение_инкремента];
Реализуем автоинкремент в Oracle. Cначала создадим сиквенс:
CREATE SEQUENCE my_seq;
CREATE TABLE my_doc (
doc_id NUMBER(20)
, doc_name VARCHAR2(256)
, CONSTRAINT pk_my_table PRIMARY KEY (doc_id)
);
Для получения очередного уникального значения сиквенс может быть использован напрямую, либо через триггер:
1. напрямую
INSERT INTO my_doc (doc_id, doc_name) VALUES (my_seq.nextval, 'Документ 1');
2. через триггер
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_doc
FOR EACH ROW
BEGIN
SELECT my_seq.NEXTVAL INTO :NEW.doc_id FROM dual;
END;
/
INSERT INTO my_doc (doc_name) VALUES ('Документ 2');
INSERT INTO my_doc (doc_id, doc_name) VALUES (null, 'Документ 3');
В версии Oracle 11g также появилась возможность делать вот так:
CREATE OR REPLACE TRIGGER my_trigger
BEFORE INSERT ON my_doc FOR EACH ROW
BEGIN
:NEW.doc_id := my_seq.NEXTVAL;
END;
Любопытно, что атрибут NEXTVAL, вычисляется не при каждом использовании, а только один раз для каждой очередной строки результата, независимо от того,
сколько раз вызывается NEXTVAL на одну строку.
Попробуйте:
CREATE SEQUENCE seq_1;
CREATE SEQUENCE seq_2 INCREMENT BY 2;
SELECT seq_1.NEXTVAL, seq_1.CURRVAL, seq_1.NEXTVAL, seq_2.CURRVAL, seq_2.NEXTVAL, seq_2.NEXTVAL
FROM all_objects
WHERE ROWNUM <= 10;
NEXTVAL CURRVAL NEXTVAL CURRVAL NEXTVAL NEXTVAL
------- ------- ------- ------- ------- -------
1 1 1 1 1 1
2 2 2 3 3 3
3 3 3 5 5 5
4 4 4 7 7 7
5 5 5 9 9 9
6 6 6 11 11 11
7 7 7 13 13 13
8 8 8 15 15 15
9 9 9 17 17 17
10 10 10 19 19 19
Автоинкрементные поля (счетчики) в Oracle
Ярлыки:
автоинкремент,
последовательность,
сиквенс,
счетчик,
триггер,
autoincrement,
CURRVAL,
identity,
increment,
NEXTVAL,
sequence,
trigger