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