За голямо разочарование на администраторите на бази данни по целия свят, преди Oracle версия 12c в средата на 2014 г., Oracle просто нямаше присъща способност да генерира автоматично увеличаващи се колони в схемата на таблица. Макар че причините за това дизайнерско решение могат само да се гадаят, добрата новина е, че дори за потребители на по-стари системи на Oracle има възможно заобиколно решение за заобикаляне на този капан и създаване на своя собствена колона с първичен ключ с автоматично увеличение.
Създаване на последователност
Първата стъпка е да създадете SEQUENCE
във вашата база данни, която е обект с данни, до който множество потребители имат достъп, за да генерират автоматично увеличени стойности. Както е обсъдено в документацията, последователност в Oracle предотвратява едновременното създаване на дублиращи се стойности, тъй като множество потребители са ефективно принудени да се „редуват“, преди да бъде генериран всеки последователен елемент.
За целите на създаването на уникален първичен ключ за нова таблица, първо трябва да CREATE
таблицата, която ще използваме:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
След това трябва да добавим PRIMARY KEY
ограничение:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Накрая ще създадем нашата SEQUENCE
която ще бъде използвана по-късно за действително генериране на уникалната, автоматично увеличена стойност.
CREATE SEQUENCE books_sequence;
Добавяне на тригер
Въпреки че имаме създадена и готова за работа маса, нашата последователност засега просто седи там, но никога не се използва. Това е мястото, където TRIGGERS
влезте.
Подобно на event
в съвременните езици за програмиране, TRIGGER
в Oracle е съхранена процедура, която се изпълнява, когато настъпи определено събитие.
Обикновено TRIGGER
ще бъде конфигуриран да се задейства при актуализиране на таблица или изтриване на запис, осигурявайки малко почистване, когато е необходимо.
В нашия случай искаме да изпълним нашия TRIGGER
преди INSERT
в нашите books
таблица, осигурявайки нашата SEQUENCE
се увеличава и тази нова стойност се предава на колоната ни с първичен ключ.
CREATE OR REPLACE TRIGGER books_on_insert
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
SELECT books_sequence.nextval
INTO :new.id
FROM dual;
END;
Тук създаваме (или заменяме, ако съществува) TRIGGER
с име books_on_insert
и указваме, че искаме тригерът да задейства BEFORE INSERT
се среща за books
таблица и да бъде приложим за всеки и всички редове в нея.
„Кодът“ на самия тригер е доста прост:ние SELECT
следващата инкрементална стойност от нашия по-рано създаден books_sequence
SEQUENCE
и го вмъкнете в :new
запис на books
таблица в посочения .id
поле.
Забележка:FROM dual
част е необходима за завършване на правилна заявка, но всъщност е ирелевантна. dual
таблицата е само един фиктивен ред от данни и се добавя, в този случай, само за да може да бъде игнорирана и вместо това да можем да изпълним системната функция на нашия тригер, вместо да връщаме данни от някакъв вид.
Колони IDENTITY
IDENTITY
колоните бяха въведени в Oracle 12c, което позволява проста функционалност за автоматично увеличение в съвременните версии на Oracle.
Използване на IDENTITY
колоната е функционално подобна на тази на други системи за бази данни. Пресъздаване на нашите по-горе books
схема на таблица в съвременен Oracle 12c или по-нова версия, просто ще използваме следната дефиниция на колона.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);