Published on

March 28, 2019

Comprendre les clés étrangères et les contraintes dans SQL Server

Dans cet article, nous explorerons le concept de clés étrangères et de contraintes dans SQL Server. Une clé étrangère est une contrainte qui garantit l’intégrité référentielle dans une base de données. Elle établit un lien entre les données de deux tables et contrôle les données pouvant être stockées dans la table de clé étrangère.

Création d’une contrainte de clé étrangère

Pour créer une contrainte de clé étrangère SQL, la table parent doit avoir une colonne de clé primaire ou une colonne avec une contrainte UNIQUE. Prenons l’exemple d’une table appelée “Dept” en tant que table parent avec une colonne de clé primaire :

CREATE TABLE Dept (
  DeptID INT CONSTRAINT PK_Dept PRIMARY KEY,
  DeptName VARCHAR(10)
)

Nous pouvons créer une contrainte de clé étrangère lors de la création d’une table. Voici un exemple de script T-SQL pour créer une clé étrangère SQL lors de la création de la table sans définir le nom de la contrainte :

CREATE TABLE Emp (
  EmpID INT,
  EmpFname VARCHAR(50),
  EmpLname VARCHAR(50),
  DeptID INT FOREIGN KEY REFERENCES Dept(DeptID),
  IsActive BIT
)

Si nous ne spécifions pas le nom de la contrainte, SQL Server créera une contrainte de clé étrangère avec un nom aléatoire. Cependant, nous pouvons également créer une clé étrangère avec un nom de contrainte spécifique :

CREATE TABLE Emp (
  EmpID INT,
  EmpFname VARCHAR(50),
  EmpLname VARCHAR(50),
  DeptID INT CONSTRAINT FK_Emp FOREIGN KEY REFERENCES Dept(DeptID),
  IsActive BIT
)

Dans certains cas, nous devons créer d’abord la table enfant, puis créer la contrainte de clé étrangère. Nous pouvons y parvenir en utilisant l’instruction ALTER TABLE :

CREATE TABLE Emp (
  EmpID INT,
  EmpFname VARCHAR(50),
  EmpLname VARCHAR(50),
  DeptID INT,
  IsActive BIT
)

ALTER TABLE [dbo].[Emp] WITH CHECK ADD CONSTRAINT [FK_Emp] FOREIGN KEY ([DeptID]) REFERENCES [dbo].[Dept] ([DeptID])
GO

ALTER TABLE [dbo].[Emp] CHECK CONSTRAINT [FK_Emp]
GO

Gestion des contraintes de clé étrangère

Dans SQL Server, nous avons la possibilité de désactiver ou d’activer les contraintes de clé étrangère. Pour désactiver une contrainte de clé étrangère, nous pouvons utiliser l’instruction suivante :

ALTER TABLE [Emp] NOCHECK CONSTRAINT [FK_Emp]

Pour réactiver la contrainte, nous pouvons utiliser l’instruction suivante :

ALTER TABLE [Emp] CHECK CONSTRAINT [FK_Emp]

Nous pouvons également forcer la clé étrangère à vérifier les données existantes lors de l’activation de la contrainte en utilisant l’option WITH CHECK :

ALTER TABLE [Emp] WITH CHECK CHECK CONSTRAINT [FK_Emp]

Gestion des mises à jour et des suppressions

Lorsqu’une clé étrangère est créée, nous pouvons spécifier l’action à effectuer sur la table de référence lorsqu’une suppression ou une mise à jour se produit sur la clé primaire dans la table parente. Par exemple, nous pouvons créer une clé étrangère avec l’option ON DELETE CASCADE :

ALTER TABLE [dbo].[Emp] WITH CHECK ADD CONSTRAINT [FK_Emp2] FOREIGN KEY ([DeptID]) REFERENCES [dbo].[Dept] ([DeptID]) ON DELETE CASCADE
GO

ALTER TABLE [dbo].[Emp] CHECK CONSTRAINT [FK_Emp2]
GO

Cela signifie que lorsque la valeur d’une clé primaire est supprimée dans la table parente, les enregistrements correspondants dans la table enfant seront également supprimés. De même, nous pouvons utiliser l’option ON UPDATE CASCADE pour mettre à jour les valeurs de clé étrangère dans la table enfant lorsque la clé primaire est mise à jour dans la table parente.

D’autres actions disponibles incluent SET NULL, qui définit la valeur de la colonne de clé étrangère à null lorsque la valeur de la clé primaire est supprimée ou mise à jour, et SET DEFAULT, qui définit la valeur par défaut sur la colonne de clé étrangère lorsque la valeur de la clé primaire est mise à jour ou supprimée.

Indexation des colonnes de clé étrangère

Lorsqu’une table est référencée par une clé étrangère, les modifications apportées à la colonne de clé primaire dans la table principale vérifieront les données dans la table enfant. Si la table enfant contient une grande quantité de données, cela peut ralentir les modifications sur la table principale et même entraîner des blocages. Pour optimiser les performances, il est recommandé de créer un index sur la colonne de clé étrangère.

En comprenant et en utilisant efficacement les clés étrangères et les contraintes dans SQL Server, nous pouvons garantir l’intégrité des données et maintenir les relations entre les tables de notre base de données.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.