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