Ku frustracji administratorów baz danych na całym świecie, przed wersją Oracle 12c w połowie 2014 r. firma Oracle po prostu nie miała wrodzonej zdolności do generowania automatycznie zwiększających się kolumn w schemacie tabeli. Chociaż przyczyny tej decyzji projektowej można tylko zgadywać, dobrą wiadomością jest to, że nawet dla użytkowników starszych systemów Oracle istnieje możliwe obejście tej pułapki i utworzenie własnej kolumny klucza podstawowego z automatycznym przyrostem.
Tworzenie sekwencji
Pierwszym krokiem jest utworzenie SEQUENCE w bazie danych, która jest obiektem danych, do którego wielu użytkowników może uzyskać dostęp, aby automatycznie generować zwiększone wartości. Jak omówiono w dokumentacji, sekwencja w Oracle zapobiega jednoczesnemu tworzeniu zduplikowanych wartości, ponieważ wielu użytkowników jest skutecznie zmuszanych do „na zmianę” przed wygenerowaniem każdego kolejnego elementu.
Aby utworzyć unikalny klucz podstawowy dla nowej tabeli, najpierw musimy CREATE tabela, której będziemy używać:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
Następnie musimy dodać PRIMARY KEY ograniczenie:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Na koniec utworzymy naszą SEQUENCE które zostaną później wykorzystane do wygenerowania unikalnej, automatycznie zwiększanej wartości.
CREATE SEQUENCE books_sequence;
Dodawanie wyzwalacza
Chociaż mamy gotowy stół, nasza sekwencja do tej pory po prostu tam siedzi, ale nigdy nie jest używana. To tutaj TRIGGERS wejdź.
Podobne do event we współczesnych językach programowania TRIGGER w Oracle to procedura składowana, która jest wykonywana po wystąpieniu określonego zdarzenia.
Zazwyczaj TRIGGER zostanie skonfigurowany tak, aby uruchamiał się, gdy tabela zostanie zaktualizowana lub rekord zostanie usunięty, zapewniając w razie potrzeby trochę oczyszczenia.
W naszym przypadku chcemy wykonać nasz TRIGGER przed INSERT do naszych books tabeli, zapewniając naszą SEQUENCE jest zwiększany, a nowa wartość jest przekazywana do naszej kolumny klucza podstawowego.
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;
Tutaj tworzymy (lub zastępujemy, jeśli istnieje) TRIGGER o nazwie books_on_insert i określenie, że chcemy, aby wyzwalacz uruchamiał BEFORE INSERT występuje dla books tabeli i ma zastosowanie do wszystkich zawartych w niej wierszy.
„Kod” samego wyzwalacza jest dość prosty:SELECT następna wartość przyrostowa z naszej poprzednio utworzonej books_sequence SEQUENCE , i wstawiając go do :new zapis books tabela w określonym .id pole.
Uwaga:kod FROM dual część jest niezbędna do zrealizowania prawidłowego zapytania, ale w rzeczywistości jest nieistotna. dual tabela jest tylko pojedynczym fikcyjnym wierszem danych i jest dodawana, w tym przypadku, tylko po to, aby można ją było zignorować i zamiast tego możemy wykonać funkcję systemową naszego wyzwalacza, zamiast zwracać jakieś dane.
Kolumny IDENTITY
IDENTITY kolumny zostały wprowadzone w Oracle 12c, co pozwala na prostą funkcję automatycznego przyrostu w nowoczesnych wersjach Oracle.
Korzystanie z IDENTITY kolumna jest funkcjonalnie podobna do innych systemów bazodanowych. Odtworzenie naszych powyższych books schemat tabeli w nowoczesnym Oracle 12c lub nowszym, po prostu użyjemy następującej definicji kolumny.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);