Tot grote frustratie van databasebeheerders over de hele wereld, vóór Oracle versie 12c medio 2014, had Oracle eenvoudigweg niet de inherente mogelijkheid om automatisch automatisch oplopende kolommen te genereren binnen een tabelschema. Hoewel de redenen voor deze ontwerpbeslissing alleen kunnen worden geraden, is het goede nieuws dat er zelfs voor gebruikers op oudere Oracle-systemen een mogelijke oplossing is om deze valkuil te omzeilen en uw eigen kolom met automatisch verhoogde primaire sleutel te maken.
Een reeks maken
De eerste stap is het maken van een SEQUENCE
in uw database, een gegevensobject waartoe meerdere gebruikers toegang hebben om automatisch verhoogde waarden te genereren. Zoals besproken in de documentatie, voorkomt een reeks in Oracle dat er tegelijkertijd dubbele waarden worden gemaakt, omdat meerdere gebruikers in feite worden gedwongen om "om de beurt" te zijn voordat elk opeenvolgend item wordt gegenereerd.
Om een unieke primaire sleutel voor een nieuwe tabel aan te maken, moeten we eerst CREATE
de tabel die we gaan gebruiken:
CREATE TABLE books (
id NUMBER(10) NOT NULL,
title VARCHAR2(100) NOT NULL
);
Vervolgens moeten we een PRIMARY KEY
. toevoegen beperking:
ALTER TABLE books
ADD (
CONSTRAINT books_pk PRIMARY KEY (id)
);
Ten slotte maken we onze SEQUENCE
die later zal worden gebruikt om de unieke, automatisch verhoogde waarde te genereren.
CREATE SEQUENCE books_sequence;
Een trigger toevoegen
Terwijl we onze tafel hebben gemaakt en klaar voor gebruik, zit onze reeks tot nu toe daar gewoon, maar wordt nooit in gebruik genomen. Dit is waar TRIGGERS
kom binnen.
Vergelijkbaar met een event
in moderne programmeertalen, een TRIGGER
in Oracle is een opgeslagen procedure die wordt uitgevoerd wanneer een bepaalde gebeurtenis plaatsvindt.
Typisch een TRIGGER
wordt geconfigureerd om te vuren wanneer een tabel wordt bijgewerkt of een record wordt verwijderd, wat een beetje opschonen biedt wanneer dat nodig is.
In ons geval willen we onze TRIGGER
. uitvoeren voorafgaand aan INSERT
in onze books
tabel, zorgend voor onze SEQUENCE
wordt verhoogd en die nieuwe waarde wordt doorgegeven aan onze primaire sleutelkolom.
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;
Hier maken we (of vervangen als het bestaat) de TRIGGER
genaamd books_on_insert
en specificeren dat we willen dat de trigger wordt geactiveerd BEFORE INSERT
komt voor voor de books
tabel, en om van toepassing te zijn op alle rijen daarin.
De 'code' van de trigger zelf is vrij eenvoudig:We SELECT
de volgende incrementele waarde van onze eerder gemaakte books_sequence
SEQUENCE
, en dat invoegen in de :new
record van de books
tabel in de opgegeven .id
veld.
Opmerking:de FROM dual
deel is nodig om een juiste query te voltooien, maar is in feite niet relevant. De dual
tabel is slechts een enkele dummy-rij met gegevens en wordt in dit geval toegevoegd zodat deze kan worden genegeerd en we in plaats daarvan de systeemfunctie van onze trigger kunnen uitvoeren in plaats van een of andere soort gegevens terug te sturen.
IDENTITY-kolommen
IDENTITY
kolommen werden geïntroduceerd in Oracle 12c, waardoor eenvoudige automatische verhogingsfunctionaliteit mogelijk is in moderne versies van Oracle.
De IDENTITY
. gebruiken column is functioneel vergelijkbaar met die van andere databasesystemen. Onze bovenstaande books
opnieuw maken tabelschema in modern Oracle 12c of hoger, zouden we gewoon de volgende kolomdefinitie gebruiken.
CREATE TABLE books (
id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
title VARCHAR2(100) NOT NULL
);