06/08/2023

1. Index d'unicité

Lu 403 fois Licence Creative Commons

Index d'unicité

La création d'un index d'unicité permet, en plus d'une optimisation de performances, de garantir que la valeur d'une colonne soit unique pour chaque enregistrement.

La création est similaire à celle d'un index classique:

CREATE UNIQUE INDEX uq_utilisateur_pseudo ON utilisateur (pseudo);

Et l'insertion d'un doublon est alors impossible:

INSERT INTO utilisateur (id, pseudo) VALUES (99, 'Charline');

[23505] ERROR: duplicate key value violates unique constraint "uq_utilisateur_pseudo"
Detail: Key (pseudo)=(Charline) already exists.

Combinaisons uniques

Il arrive également de vouloir éviter des doublons sur plusieurs colonnes, et donc avoir des combinaisons de colonnes uniques.

En partant d'une table de véhicules:

CREATE TABLE vehicule (
    id INT NOT NULL,
    marque VARCHAR(25) NOT NULL,
    modele VARCHAR(25) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO vehicule (id, marque, modele) VALUES
(1, 'Renault', 'Clio'),
(2, 'Renault', 'Trafic'),
(3, 'Peugeot', '206'),
(4, 'Peugeot', 'Partner'),
(5, 'Toyota', 'Auris');

Il y a une erreur de normalisation dans cet exemple afin de simplifier la démonstration. Comment devrait-on structurer les données de manière optimale ?

On crée ensuite un index d'unicité sur 2 colonnes:

CREATE UNIQUE INDEX uq_vehicule_marque_modele ON vehicule (marque, modele);

Il est possible d'avoir plusieurs fois la même marque ou le même nom de modèle:

INSERT INTO vehicule (id, marque, modele) VALUES (6, 'Renault', 'Auris');

Mais il n'est pas possible d'avoir 2 fois la même combinaison de ces 2 colonnes:

INSERT INTO vehicule (id, marque, modele) VALUES (7, 'Toyota', 'Auris');

[23505] ERROR: duplicate key value violates unique constraint "uq_vehicule_marque_modele"
Detail: Key (marque, modele)=(Toyota, Auris) already exists.