Categories: Шпаргалки

Как создать поле со свойством auto_increment в Oracle

В СУБД MySQL есть возможность использовать свойство auto_increment для числового поля — оно автоматически добавляет единицу числовому полю для следующей строки при вставке. Таким образом система самостоятельно генерирует уникальный идентификатор для записи. В Oracle данную функциональность можно реализовать при помощи триггера (ранее версии 12с) или свойства IDENTITY (с версии 12c).

Триггер (до Oracle 12c)

В данном примере, наша таблица будет называться ai_table , а поле, которому необходимо добавить возможность auto_increment — id .

Создаем последовательность следующей SQL-командой:

CREATE SEQUENCE sq_ai_table
START WITH 1
INCREMENT BY 1
NOMAXVALUE;

* в данном примере создана последовательность с названием sq_ai_table . Начинается последовательность с 1 и каждый шаг будет добавлять тоже 1 .

Теперь создаем сам триггер:

CREATE OR REPLACE TRIGGER tr_ai_table before INSERT ON ai_table FOR each row
BEGIN
SELECT sq_ai_table.NEXTVAL
INTO :new.id
FROM dual;
END;

* как видим, создан триггер с названием tr_ai_table для таблицы ai_table . При каждой INSERT команде будет браться число из нашей созданной последовательности и подставляться в поле id .

IDENTITY (Oracle 12c и более поздние)

Начиная с версии Oracle 12c есть возможность создать таблицу со свойством поля IDENTITY, которое является аналогом auto increment или autonumber.

Пример создания таблицы:

CREATE TABLE ai_table
(
id INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),
name VARCHAR(512) NOT NULL,
UNIQUE (id, name)
)

* где id — поле со свойством автоинкремента с шагом 1 и начальным значением 1 .

admin

Recent Posts

Настройка Mercurial по HTTPS

Иногда mercurial, при скачивании и комитах ругается на https. Особенно на самоподписанные сертификаты. Чтобы заработал…

3 недели ago

Компиляция libvirt в Ubuntu

Компиляция libvirt Подробнее

3 недели ago

Ошибка libvirt permission denied: решение

Если возникает ошибка libvirt destroy lxc permission denied , при попытке остановить контейнер: _x000D_# virsh…

3 недели ago

Настройка редиректа в NGINX

Файлы с примерами редиректа для nginx Подробнее

3 недели ago

Включение gzip в NGINX

Как включить gzip сжатие в Nginx ? Подробнее

3 недели ago

Удаление postinst-скрипта в Linux

Иногда возникает ситуация, когда криво настроенные пакеты не устанавливаются в системе. У меня это произошло…

3 недели ago