sql >> Databáze >  >> RDS >> Oracle

Jak definovat primární klíč automatického zvýšení v Oracle

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

  1. Přestaňte prosím používat tento anti-vzor UPSERT

  2. SCD typ 1

  3. PostgreSQL ZOBRAZIT TABULKY Ekvivalent (psql)

  4. špatný výběr výkonu Hibernate ve srovnání s přímým spuštěním - jak ladit?