Dashboard > СУБД > Home > Oracle, auto_increment > Просмотр
  СУБД Вход | Зарегистрироваться   Вариант для печати.  
  Oracle, auto_increment
Добавил(а) shixaro, последний раз редактировал(а) shixaro Mar 06, 2012  (посмотреть изменения)
Метки: 
(None)

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

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

Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5 Build:#805 Apr 26, 2007) - Запрос Bug/feature - Связаться с администраторами