Oracle, auto_increment

Mar 06, 2012 14:40



В MySQL есть прямая директива для поля в таблице: auto_increment.

Например:

CREATE TABLE mytable(
id MEDIUMINT NOT NULL AUTO_INCREMENT
);

В PostgreSQL и Oracle этот вопрос решен иначе - с помощью последовательностей. На первый взгляд, более сложно, но, одновременно, и более гибко.

Допустим, такая же таблица нам нужна в оракле.

CREATE TABLE mytable(
id NUMBER
);

Поэтому нужно создать последовательность. В постгресе и оракле это делается почти одинаково. Oracle:

CREATE SEQUENCE mytable_seq
START WITH 1
INCREMENT BY 1
NOMAXVALUE;

Теперь нужно привязать эту последовательность к полю.

В постгресе это делалось бы так:

alter table mytable alter column id SET DEFAULT NEXTVAL('mytable_seq')

Синтаксис работы с последовательностями в оракле немного отличается от постгресового хотя бы на примере nextval. В Oracle nextval берется так:

select nextval('mytable_seq') from dual

Но Oracle не позволяет засунуть в default для столбца несистемную функцию - в данном случае nextval. И все примеры вставки в таблицу с использованием последовательности выглядят примерно так:

INSERT INTO mytable (id) VALUES (mytable_seq.nextval);

Еще один вариант - использование костыля в лице триггера, что, в целом, в ворота еще как-то лезет, но не во все:

create or replace trigger mytable_trg
before insert on mytable
for each row
begin
if :new.id is null then
select mytable_seq.nextval into :new.id from dual;
end if;
end;

Возможно, этот неприятный момент будет устранен в будущих версиях оракла.


dba, oracle, компьютерные штучки, sql, mysql, dbms, postgresql

Previous post Next post
Up