K velké frustraci správců databází po celém světě neměl Oracle před verzí Oracle 12c v polovině roku 2014 žádnou vlastní schopnost inherentně generovat sloupce s automatickým přírůstkem v rámci schématu tabulky. I když důvody pro toto rozhodnutí o návrhu lze pouze hádat, dobrou zprávou je, že i pro uživatele starších systémů Oracle existuje možné řešení, jak obejít toto úskalí a vytvořit si svůj vlastní automaticky inkrementovaný sloupec primárního klíče.
Vytvoření sekvence
Prvním krokem je vytvoření SEQUENCE
ve vaší databázi, což je datový objekt, ke kterému může přistupovat více uživatelů a automaticky generovat zvýšené hodnoty. Jak je uvedeno v dokumentaci, sekvence v Oracle zabraňuje současnému vytváření duplicitních hodnot, protože více uživatelů je účinně nuceno „střídat se“ před vygenerováním každé sekvenční položky.
Pro účely vytvoření jedinečného primárního klíče pro novou tabulku musíme nejprve CREATE
tabulku, kterou budeme používat:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
Dále musíme přidat PRIMARY KEY
omezení:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Nakonec vytvoříme naši SEQUENCE
který bude později použit ke skutečnému vygenerování jedinečné, automaticky navýšené hodnoty.
CREATE SEQUENCE books_sequence;
Přidání spouštěče
Zatímco máme stůl vytvořený a připravený k použití, naše sekvence zatím jen sedí, ale nikdy se nepoužívá. Toto je místo TRIGGERS
vstupte.
Podobné jako event
v moderních programovacích jazycích TRIGGER
v Oracle je uložená procedura, která se spustí, když nastane určitá událost.
Obvykle TRIGGER
bude nakonfigurováno tak, aby se spustilo při aktualizaci tabulky nebo smazání záznamu, což v případě potřeby zajistí drobné vyčištění.
V našem případě chceme spustit náš TRIGGER
před INSERT
do našich books
tabulku, čímž zajistíme naši SEQUENCE
se zvýší a tato nová hodnota se předá do našeho sloupce primárního klíče.
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;
Zde vytváříme (nebo nahrazujeme, pokud existuje) TRIGGER
s názvem books_on_insert
a určení, že chceme, aby se spouštěč spustil BEFORE INSERT
vyskytuje u books
tabulky a lze je použít na všechny řádky v ní.
„Kód“ samotného spouštěče je poměrně jednoduchý:SELECT
další přírůstkovou hodnotu z naší dříve vytvořené books_sequence
SEQUENCE
a vložením do :new
záznam books
tabulky v zadaném .id
pole.
Poznámka:FROM dual
část je nezbytná k dokončení správného dotazu, ale je v podstatě irelevantní. dual
tabulka je pouze jeden fiktivní řádek dat a je přidána, v tomto případě, jen proto, aby mohla být ignorována a místo toho můžeme provádět systémovou funkci našeho spouštěče, než abychom vraceli data nějakého druhu.
Sloupce IDENTITY
IDENTITY
sloupce byly zavedeny v Oracle 12c, což umožňuje jednoduchou funkci automatického zvýšení v moderních verzích Oracle.
Pomocí IDENTITY
sloupec je funkčně podobný jako u jiných databázových systémů. Znovu vytváříme naše výše uvedené books
schéma tabulky v moderním Oracle 12c nebo vyšším, jednoduše bychom použili následující definici sloupce.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);