sql >> Database >  >> RDS >> Oracle

Hoe een Auto Increment Primary Key in Oracle te definiëren

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

  1. LEN-functie zonder volgspaties in SQL Server

  2. MySQL:transacties versus tabellen vergrendelen

  3. SQL Server COALESCE() uitgelegd

  4. MySQL - Krijg rijnummer bij selecteren