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.