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

Aperçu des contraintes uniques de SQL Server

Quelles sont les contraintes de clé uniques ?

Une contrainte unique est une règle qui limite les entrées de colonne à uniques. En d'autres termes, ce type de contraintes empêche l'insertion de doublons dans une colonne. Une contrainte unique est l'un des instruments permettant d'appliquer l'intégrité des données dans une base de données SQL Server. Puisqu'une table ne peut avoir qu'une seule clé primaire, vous pouvez utiliser une contrainte d'unicité pour imposer l'unicité d'une colonne ou d'une combinaison de colonnes qui ne constituent pas une clé primaire.

La création d'une contrainte d'unicité sur une colonne crée automatiquement un index unique. De cette façon, SQL Server implémente l'exigence d'intégrité de la contrainte unique. Par conséquent, lors d'une tentative d'insertion d'une valeur en double dans une colonne sur laquelle une contrainte d'unicité est définie, le moteur de base de données détectera la violation de la contrainte d'unicité et émettra une erreur correspondante. Par conséquent, la ligne avec les valeurs en double ne sera pas ajoutée à une table.

Créer une contrainte unique

L'exemple de requête suivant crée les Étudiants table et une contrainte unique sur le Connexion colonne afin qu'il n'y ait pas d'élèves avec le même identifiant.

CREATE TABLE Étudiants (Connexion CHAR NOT NULL,CONSTRAINT AK_Student_Login UNIQUE (Connexion));GO

Si les étudiants table existe déjà, vous pouvez utiliser l'exemple de requête suivant pour créer la contrainte unique.

ALTER TABLE StudentsADD CONSTRAINT AK_Student_Login UNIQUE (Login);GO

Notez que lorsque vous ajoutez une contrainte d'unicité à une table existante, le moteur de base de données vérifie si la colonne à laquelle la contrainte est ajoutée contient des valeurs en double. S'il existe de telles valeurs, la contrainte ne sera pas ajoutée et renverra une erreur.

Maintenant, pour vérifier que la contrainte unique a bien été ajoutée, exécutez les instructions suivantes :

EXEC sp_helpindex EtudiantsEXEC sp_helpconstraint Etudiants

Voici la contrainte que nous avons créée :

Création d'une contrainte unique dans SQL Server Management Studio

Disons que nous devons définir une contrainte unique sur le Connexion colonne les Étudiants tableau.

1. Dans l'Explorateur d'objets , faites un clic droit sur Étudiants tableau et cliquez sur Design .

2. Cliquez avec le bouton droit sur le Concepteur de tableaux et choisissez Index/Clés…

3. Dans les Index/Clés fenêtre, cliquez sur Ajouter .

4. Sous le Général section, cliquez sur Colonnes puis cliquez sur le bouton points de suspension. Dans les colonnes d'index fenêtre, sélectionnez la ou les colonnes que vous souhaitez inclure dans la contrainte d'unicité.

5. Sous le Général section, cliquez sur Type et sélectionnez Clé unique dans la liste déroulante.

6. Sous Identité section, indiquez le nom de la contrainte (dans notre cas, AK_Student_Login ) et cliquez sur Fermer pour enregistrer la contrainte nouvellement créée.

Maintenant, si vous allez aux Étudiants tableau dans l'Explorateur d'objets et cliquez sur Index dossier, vous verrez que la table contient une clé primaire et une contrainte unique AK_Student_Login .

En quoi les contraintes uniques sont-elles différentes des clés primaires ?

Semblable à une contrainte unique, une clé primaire est également utilisée pour appliquer l'intégrité des données dans une table. Mais l'objectif principal d'une clé primaire est d'identifier de manière unique chaque enregistrement d'une table et d'implémenter des relations appropriées entre les tables d'une base de données. Une clé primaire est requise dans 99 % des tables pour permettre un accès correct aux lignes de la table. Il ne peut y avoir qu'une seule clé primaire par table définie sur une ou plusieurs colonnes.

Les contraintes uniques sont spécifiquement utilisées pour empêcher l'insertion de valeurs en double dans une colonne. Il peut y avoir plusieurs colonnes avec des contraintes uniques ou il peut n'y avoir aucune contrainte unique définie sur une table. Elles ne sont pas obligatoires pour une table contrairement aux clés primaires.

Disons que nous avons les Étudiants tableau contenant des informations personnelles sur chaque étudiant d'une université. Le tableau inclut le StudentID colonne qui est une clé primaire et stocke un identifiant unique de chaque étudiant spécifique. Cette colonne de clé primaire est utilisée pour identifier de manière unique chaque étudiant d'une université.

Dans le même temps, les étudiants la table a des colonnes telles que Email , Numéro de sécurité sociale , et Connexion et chacune de ces colonnes doit stocker des valeurs uniques. Puisqu'il existe déjà une clé primaire dans la table, nous utiliserons plutôt des contraintes uniques pour imposer l'unicité à ces colonnes. Ainsi, une table peut avoir de nombreuses contraintes uniques et une seule clé primaire.

Une autre chose qui diffère une contrainte unique d'une clé primaire est que la clé primaire n'autorise aucun NULL valeurs dans une colonne, alors qu'une colonne avec une contrainte unique peut inclure un NULL valeur mais une seule puisque SQL Server interprète deux valeurs NULL comme les mêmes valeurs.

Supposons qu'une contrainte unique soit créée sur le Email colonne des Étudiants table. Essayons d'insérer deux lignes avec NULL s dans le E-mail champs :

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')GO

Nous obtenons le message d'erreur suivant :

Eh bien, c'est un comportement prévisible, car les valeurs en double, même si elles sont NULL, ne sont pas autorisées par la contrainte unique.

Contrainte unique vs Index unique

Bien que la contrainte unique et l'index unique soient deux entités de base de données complètement différentes et non liées, ils ont le même objectif et le même impact sur les performances de SQL Server. Ils garantissent tous deux l'unicité des données dans une colonne.

Cependant, contrairement à l'index unique, vous ne pouvez pas spécifier les options IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX et STATISTICS_NORECOMPUTE pour la contrainte unique dans les instructions ALTER TABLE.

Lorsque vous créez une contrainte unique sur une colonne, SQL Server crée automatiquement un index unique sur la colonne, c'est ainsi que cette fonctionnalité est implémentée dans SQL Server.

Afin de supprimer l'index unique, vous devez d'abord supprimer la contrainte unique correspondante et cela supprimera automatiquement l'index unique sous-jacent.

La déclaration suivante supprimera le AK_Student_Login contrainte :

ALTER TABLE Étudiants DROP CONSTRAINT AK_Student_Login ; ALLER

Vous pouvez voir que supprimer le AK_Student_Login la contrainte unique supprime son index correspondant.

C'était facile, maintenant vous pouvez insérer des valeurs identiques dans le Connexion colonne.

Désactivation de la contrainte unique

Il existe une option qui désactive une contrainte unique. La requête suivante est censée désactiver toutes les contraintes de table :

ALTER TABLE ÉtudiantsNOCHECK CONSTRAINT ALLGO

Après avoir exécuté la requête, essayons maintenant d'insérer un enregistrement en double :

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')GO

Ce que nous obtenons est le message unique de violation de contrainte :

Ainsi, il semble que ALTER TABLE NOCHECK CONSTRAINT ALL GO ne fonctionne pas pour les contraintes uniques dans SQL Server.

Cependant, rappelez-vous qu'il existe un index unique sous le capot de chaque contrainte unique, et nous devrions pouvoir désactiver un index unique. Dans notre cas, le AK_Student_Email la contrainte unique a créé le AK_Student_Email correspondant index unique sur Email colonne. Utilisons la requête suivante pour désactiver le AK_Student_Email index unique en premier.

ALTER INDEX AK_Student_Email ON StudentsDISABLE ;

La requête s'est terminée avec succès, alors insérons maintenant deux enregistrements avec Email en double champs dans les Étudiants tableau.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')GO 
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')GO 

Ça marche! Les enregistrements ont été insérés dans le tableau ! Nous savons maintenant comment contourner ce problème de « désactivation » avec une contrainte unique.

Pour activer l'index, utilisez la requête suivante :

ALTER INDEX AK_Student_Email ON StudentsREBUILD ;

Conclusion

Les contraintes de clé uniques permettent aux administrateurs de base de données et aux développeurs SQL d'appliquer et de préserver l'unicité des données dans les colonnes de table, ainsi que d'appliquer certaines exigences commerciales pour l'intégrité des données. Fondamentalement, il n'y a pas de différence substantielle de comportement entre une contrainte unique et un index unique, à l'exception du fait que la contrainte unique ne peut pas être directement désactivée et que certaines options de création d'index ne sont pas disponibles pour les contraintes uniques dans l'instruction ALTER TABLE.

J'espère que cet article était intéressant. Vous pouvez poser des questions, laisser des commentaires et des suggestions concernant cet article.

Voir aussi : CHECK Contraintes dans SQL Server