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

La différence entre la clé primaire et la clé unique

"Quelle est la différence entre une contrainte de clé primaire et une contrainte de clé unique ?"

C'est probablement la question d'entretien d'embauche la plus fréquemment posée aux développeurs de bases de données. Dans cet article, nous allons essayer d'y répondre.

Commençons par examiner ce que sont les clés primaires et uniques, ainsi que leurs similitudes.

Clé primaire

Une clé primaire est utilisée pour identifier de manière unique chaque enregistrement de la table. Chaque table doit avoir au moins une clé primaire. Pour définir une clé primaire dans SQL Server, il vous suffirait d'utiliser les mots-clés "Primary Key" après le nom de la colonne.

Clé unique

Une colonne avec une contrainte de clé unique ne peut contenir que des valeurs uniques - c'est le résultat de la clé unique interdisant le stockage de valeurs en double dans une colonne.

Pour définir une clé unique, vous devez ajouter "Unique" au nom du champ. N'oubliez pas qu'il n'est pas obligatoire d'avoir une clé unique dans une table.

Exemple de création de clés primaires et uniques

Le script suivant crée une base de données "Test" qui contient une table appelée "Voitures".

Cette table aura une colonne de clé primaire nommée "ID" et une colonne de clé unique nommée "NumberPlate".

CREATE DATABASE TEST
GO
USE TEST
GO


CREATE TABLE Cars (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int
);

Ensuite, ajoutons quelques enregistrements factices à notre table "Voitures". Exécutez le script suivant :

INSERT INTO Cars
VALUES 
(1, 'Toyota', 'ABC 123', 199),
(2, 'Toyota', 'ABC 345', 207),
(3, 'Toyota', 'ABC 758', 205),
(4, 'Toyota', 'ABC 741', 306),
(5, 'Toyota', 'ABC 356', 124)

Avant de parler des différences, examinons d'abord les similitudes entre les clés primaires et uniques.

Similarités entre les clés primaires et uniques

  1. Les colonnes avec des clés primaires ou uniques ne peuvent pas avoir de valeurs en double.

Essayons d'ajouter un nouvel enregistrement avec une valeur d'ID de 2 (qui existe déjà) à la table "Voitures". Exécutez le script suivant :

INSERT INTO Cars
VALUES 
(2, 'Toyota', 'ABC 345', 356)

Lorsque vous exécutez le script ci-dessus, l'erreur suivante s'affiche :

L'erreur indique clairement que cette instruction viole la contrainte de clé primaire et que les valeurs en double ne peuvent pas être insérées dans la colonne de clé primaire.

De même, essayons d'insérer une valeur en double dans la colonne "NumberPlate" avec une contrainte de clé unique en utilisant la requête suivante :

INSERT INTO Cars
VALUES 
(6, 'Toyota', 'ABC 345', 356)

Cette fois, vous verrez qu'il y a une violation de la contrainte de clé unique puisque la valeur 'ABC 345' existe déjà dans la colonne 'NumberPlate' qui a une contrainte de clé unique. Le message d'erreur ressemblera à ceci :

  1. Étant donné que les colonnes de clé primaire et uniques n'acceptent pas les valeurs en double, elles peuvent être utilisées pour identifier de manière unique un enregistrement dans la table. Cela signifie que, pour chaque valeur de la colonne de clé primaire ou unique, un seul enregistrement sera renvoyé.

Différences entre les clés primaires et uniques

Maintenant que nous comprenons les similitudes entre les clés primaires et uniques, examinons leurs différences.

  1. Une table ne peut avoir qu'une seule clé primaire, mais plusieurs clés uniques.

L'exemple suivant nous aidera à mieux comprendre cela.

Dans la base de données "Test" que nous avons créée précédemment, créons une nouvelle table "Cars2" avec deux clés primaires. Pour cela, exécutez le script suivant :

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int PRIMARY KEY
);

Dans le script ci-dessus, nous définissons des contraintes de clé primaire sur les colonnes ID et Model. Cependant, étant donné qu'une seule colonne dans une table peut avoir une contrainte de clé primaire, vous verrez l'erreur suivante :

Ce message d'erreur nous informe clairement qu'une table ne peut pas avoir plusieurs contraintes de clé primaire.

Maintenant, ajoutons plusieurs contraintes de clé uniques à la table "Cars2". Jetez un oeil au script suivant :

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int UNIQUE
);

Cela nous permet d'ajouter des contraintes de clé uniques sur les colonnes "NumberPlate" et "Model". Puisqu'une table peut avoir plusieurs colonnes avec des contraintes de clé uniques, vous ne verrez aucun message d'erreur lors de l'exécution du script ci-dessus.

  1. La colonne de clé primaire ne peut pas avoir de valeurs nulles tandis que la colonne Unique Key peut avoir une valeur nulle.

Voyons cela en action. Tout d'abord, ajoutons un enregistrement avec une valeur nulle à une colonne de clé primaire dans la table "Voitures". Regardez le script ci-dessous :

INSERT INTO Cars
VALUES 
( null, 'Toyota', 'ABC 345', 356)

Vous pouvez voir que ce script insère null comme valeur dans la colonne ID. Lorsque vous l'exécutez, vous devriez voir l'erreur suivante dans la fenêtre de message de sortie :

L'erreur nous indique qu'une valeur nulle ne peut pas être insérée car la colonne de clé primaire n'autorise pas les valeurs nulles.

Essayons maintenant d'ajouter des valeurs nulles à la colonne de clé unique "NumberPlate". Pour cela, exécutez le script suivant :

INSERT INTO Cars
VALUES 
( 6, 'Toyota',null, 356)

Cela ajoute un nouvel enregistrement avec une valeur d'ID de 6 et une valeur nulle à la table "Voitures" - plus précisément, la valeur nulle est attribuée à la colonne "NumberPlate". Vous verrez que le script ci-dessus s'exécutera sans erreur puisque la colonne de clé unique peut accepter des valeurs nulles par défaut.

Pour vérifier si la valeur nulle a bien été insérée dans la colonne "NumberPlate", nous devrons sélectionner tous les enregistrements de la table "Cars" en utilisant le script suivant :

SELECT * FROM Cars


Dans le jeu de résultats ci-dessus, nous pouvons clairement voir que la colonne de clé primaire "ID" ne ne contient aucune valeur nulle. D'autre part, la colonne "NumberPlate" avec une contrainte de clé unique contient une valeur nulle que nous venons d'insérer. N'oubliez pas que vous ne pouvez pas ajouter plus d'une valeur nulle à une colonne de clé unique car la deuxième valeur nulle sera le doublon de la première - et les doublons ne sont pas autorisés.

  1. Par défaut, un index clusterisé unique est créé sur la colonne de clé primaire ; d'autre part, un index unique non clusterisé est créé sur la colonne de clé unique.

Pour voir les index de la table "Cars", exécutez le script suivant :

USE TEST
GO
sp_help Cars

Dans la sortie, vous verrez les détails de la table "Voitures", y compris les indices, comme indiqué dans la figure ci-dessous :

Dans la figure ci-dessus, vous pouvez voir que la colonne "NumberPlate" a un index unique non clusterisé tandis que la colonne ID a un index unique clusterisé.

Conclusion

Malgré quelques similitudes fondamentales, les clés primaires et uniques présentent des différences significatives. Vous ne pouvez avoir qu'une seule clé primaire par table, mais plusieurs clés uniques. De même, une colonne de clé primaire n'accepte pas les valeurs nulles, tandis que les colonnes de clé unique peuvent contenir chacune une valeur nulle. Et enfin, la colonne de clé primaire a un index cluster unique tandis qu'une colonne de clé unique a un index non cluster unique.