Autonumerowanie w Oraclu?

Jeśli ktoś korzystał przykładowo z bazy MySQL i przesiadł się na Oracla – w pewnym momencie pewnie spyta: „a jak zrobić autonumerowanie klucza podstawowego”?
Otóż Oracle nie udostępnia takiej funkcjonalności samej w sobie. Ale możemy ją sobie napisać ;)

Zacznijmy od tabelki, która będzie miała klucz podstawowy, który chcemy automatycznie numerować:

 CREATE TABLE TABELKA
  (
    ID NUMBER(8) PRIMARY KEY,
    OPIS VARCHAR2(100))

Teraz musimy utworzyć sekwencję, która pozwoli nam pobierać kolejne wartości:

 CREATE SEQUENCE TABELKA_SEQ START WITH 1 INCREMENT BY 1

Warto przyjąć konwencję nazewniczą dla sekwencji: nazwa_tabeli_SEQ, pozwala to zachować w bazie porządek. Nasza sekwencja zacznie numerować od jedynki i będzie się zwiększać o jeden z każdym kolejnym rekordem.

I teraz tworzymy funkcjonalność, która zastąpi nam autonumerowanie: będzie to wyzwalacz, który za każdym razem gdy użytkownik spróbuje dodać wiersz bez klucza podstawowego – sam podstawi klucz korzystając z utworzonej sekwencji:

CREATE OR REPLACE TRIGGER TABELKA_PODSTAW_PK 
 BEFORE INSERT ON TABELKA
 FOR EACH ROW
    BEGIN
      :new.ID:=TABELKA_SEQ.nextval;
    END;

Pora na testy:

INSERT INTO TABELKA (OPIS) VALUES ('Wpis testowy')

Komunikat „1 rows inserted.” mówi nam, że wszystko przebiegło pomyślnie.

Bez triggera musielibyśmy każdorazowo używać sekwencji:

INSERT INTO TABELKA (ID, OPIS) 
VALUES (TABELKA_SEQ.nextval, 'Wpis testowy')

Dodatkowo jeśli nasz użyszkodnik spróbuje zrobić tak:

INSERT INTO TABELKA (ID, OPIS) 
VALUES (666, 'Wpis testowy')

Trigger automatycznie zamieni 666 na kolejną wartość sekwencji. W ten sposób w przyszłości można uniknąć błędu powtórzonej wartości.

Prawda, że tak jest prościej? :)

PS. Jeśli korzystasz z wersji niższej niż 11g – koniecznie zajrzyj tutaj

One thought on “Autonumerowanie w Oraclu?

  1. Pingback: Pobranie wartości sekwencji w Oracle 10i | SELECT * FROM mb_log

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>