Автор Тема: Автоикремент в oracle  (Прочитано 10064 раз)

Марахтанов Алексей

  • Администратор
  • Постоялец
  • *****
  • Сообщений: 205
    • marahtanov.ru
Автоикремент в oracle
« : 26 Февраль 2011, 00:38:44 »
Часто при работе с таблицами нам хочется, чтобы значение первичного ключа для новой строки (при добавлении) генерировалось автоматически (например, устанавливалось как число на 1 больше, чем максимальное из существующих)

В mysql существует удобный механизм для подобных действий - при создании таблицы достаточно объявить поле автоикрементным:

CREATE TABLE news (
     id INT(11) NOT NULL AUTO_INCREMENT,
     title VARCHAR(100) NOT NULL,
     PRIMARY KEY (id)
)

после этого любой запрос на вставку данных в таблицу без явно указанного id автоматически вставит нужное значение первичного ключа (1, 2, 3 и т.д. для каждой новой записи).

В СУБД Oracle подобной возможности не существует, однако предусмотрен альтернативный вариант реализации добавления автоикрементного значения ключа.

Для хранения очередного значения предусмотрен объект схемы типа последовательность (sequence) - некоторый счетчик. Простейший запрос для создания секвенции:

create sequence news_seq start with 1где news_seq - имя секвенции, 1 - ее начальное значение.

В дальнейшем в запросах на вставку созданную секвенцию можно использовать следующим образом:
insert into news (id, title) values (news_seq.nextval, 'Новость 1')
каждый вызов news_seq.nextval будет генерировать новое значение счетчика. news_seq.currval позволит узнать (если потребуется) значение последнего сгенерированного значения (в рамках одной сессии).

Если возникает желание в точности воссоздать автоикремент, аналогичный mysql (чтобы очередное значение счетчика вставлялось автоматически, без явного указания в insert-запросе), необходимо создать триггер - специальный объект в Oracle, содержащий код, исполняемый при каждой вставке в таблицу. Сделать это можно следующим образом:

create or replace
TRIGGER tr_news_pk
 BEFORE INSERT ON news
 FOR EACH ROW
BEGIN
 SELECT news_seq.nextval
 INTO :new.id
 FROM dual;
 END;

где tr_news_pk - имя триггера, news - имя таблицы, для которой мы реализуем автоинкрементную вставку (должна быть создана до создания триггера), news_seq - имя секвенции (должна быть создана до создания триггера), id - поле в таблице news, для которого мы хотим автоматом вычислять очередное значение.
« Последнее редактирование: 26 Февраль 2011, 00:41:58 от Марахтанов Алексей »

tarianz

  • Новичок
  • *
  • Сообщений: 3
Re: Автоикремент в oracle
« Ответ #1 : 24 Сентябрь 2011, 11:52:46 »
На Мускул похож. )