Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment définir une clé primaire d'incrémentation automatique dans Oracle

À la grande frustration des administrateurs de bases de données du monde entier, avant la version 12c d'Oracle à la mi-2014, Oracle n'avait tout simplement aucune capacité inhérente à générer de manière inhérente des colonnes à incrémentation automatique dans un schéma de table. Bien que les raisons de cette décision de conception ne puissent être que devinées, la bonne nouvelle est que même pour les utilisateurs d'anciens systèmes Oracle, il existe une solution de contournement possible pour contourner cet écueil et créer votre propre colonne de clé primaire auto-incrémentée.

Créer une séquence

La première étape consiste à créer une SEQUENCE dans votre base de données, qui est un objet de données auquel plusieurs utilisateurs peuvent accéder pour générer automatiquement des valeurs incrémentées. Comme indiqué dans la documentation, une séquence dans Oracle empêche la création simultanée de valeurs en double, car plusieurs utilisateurs sont effectivement obligés de « se relayer » avant que chaque élément séquentiel ne soit généré.

Afin de créer une clé primaire unique pour une nouvelle table, nous devons d'abord CREATE le tableau que nous allons utiliser :

CREATE TABLE books (
  id      NUMBER(10)    NOT NULL,
  title   VARCHAR2(100) NOT NULL
);

Ensuite, nous devons ajouter une PRIMARY KEY contrainte :

ALTER TABLE books
  ADD (
    CONSTRAINT books_pk PRIMARY KEY (id)
  );

Enfin, nous allons créer notre SEQUENCE qui sera utilisé plus tard pour réellement générer la valeur unique, automatiquement incrémentée.

CREATE SEQUENCE books_sequence;

Ajouter un déclencheur

Alors que notre table est créée et prête à l'emploi, notre séquence est jusqu'à présent là, mais n'est jamais utilisée. C'est là que TRIGGERS entrez.

Similaire à un event dans les langages de programmation modernes, un TRIGGER dans Oracle est une procédure stockée qui est exécutée lorsqu'un événement particulier se produit.

Typiquement un TRIGGER sera configuré pour se déclencher lorsqu'une table est mise à jour ou qu'un enregistrement est supprimé, fournissant un peu de nettoyage si nécessaire.

Dans notre cas, nous voulons exécuter notre TRIGGER avant INSERT dans nos books table, en veillant à notre SEQUENCE est incrémenté et cette nouvelle valeur est transmise à notre colonne de clé primaire.

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;

Ici nous créons (ou remplaçons s'il existe) le TRIGGER nommé books_on_insert et en spécifiant que nous voulons que le déclencheur se déclenche BEFORE INSERT se produit pour les books tableau, et applicable à toutes les lignes qu'il contient.

Le « code » du déclencheur lui-même est assez simple :nous SELECT la prochaine valeur incrémentielle de notre books_sequence créé précédemment SEQUENCE , et en l'insérant dans le :new enregistrement des books table dans le .id spécifié champ.

Remarque :Le FROM dual une partie est nécessaire pour compléter une requête appropriée, mais n'est effectivement pas pertinente. Le dual table est juste une seule ligne factice de données et est ajoutée, dans ce cas, juste pour qu'elle puisse être ignorée et nous pouvons à la place exécuter la fonction système de notre déclencheur plutôt que de renvoyer des données quelconques.

Colonnes IDENTITY

IDENTITY les colonnes ont été introduites dans Oracle 12c, permettant une simple fonctionnalité d'incrémentation automatique dans les versions modernes d'Oracle.

Utilisation de l'IDENTITY La colonne est fonctionnellement similaire à celle des autres systèmes de base de données. Recréer nos books ci-dessus schéma de table dans Oracle 12c moderne ou supérieur, nous utiliserions simplement la définition de colonne suivante.

CREATE TABLE books (
  id      NUMBER        GENERATED BY DEFAULT ON NULL AS IDENTITY,
  title   VARCHAR2(100) NOT NULL
);