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

CONTRAINTE DE CLÉ ÉTRANGÈRE SQL :le guide ultime et simple pour les débutants

Débutant? Dans ce cas, une clé étrangère SQL peut vous être étrangère.

Vous avez peut-être entendu différentes opinions sur les clés étrangères SQL. Si vous ne l'avez pas fait, vous le ferez bientôt. Ou votre expérience affectera votre point de vue. La principale chose à savoir est que les clés étrangères sont indispensables dans les bases de données relationnelles.

Pourtant, certains développeurs peuvent supprimer ou ignorer les clés étrangères lorsqu'ils sont confrontés à certaines complications. Alors que faire? Utiliser la clé étrangère ou ne pas l'utiliser ? Y aura-t-il des moments où vous n'aurez pas besoin de les utiliser ?

Ce guide est pour vous de voir à quel point cette chose est importante. Vous connaîtrez également quelques pièges dans le code et apprendrez à les résoudre. De plus, bien sûr, nous utiliserons des exemples pratiques. Il n'y a rien que vous ne puissiez gérer.

Qu'est-ce qu'une clé étrangère SQL ?

Tout d'abord. Qu'est-ce qu'une clé étrangère en SQL ? En quelques mots, c'est une clé qui relie 2 tables. Disons que vous avez une table parent et une table enfant. Il y a des points communs qui en font un parent et un enfant - la clé qui relie ces 2 tables.

Cependant, dans les bases de données SQL, une clé étrangère ne concerne pas uniquement les tables. Il renforce la relation. C'est pourquoi on parle de contrainte de clé étrangère.

Une erreur se produira si vous essayez d'ajouter un enregistrement enfant avec une valeur de clé étrangère qui n'existe pas dans les clés primaires de la table parent. Plus tard, nous verrons des exemples de code illustrant cela.

Quelles tables doivent avoir des contraintes de clé étrangère SQL ?

Les tables enfants peuvent avoir des clés étrangères. Une clé étrangère peut faire référence à une autre table. De plus, il peut y avoir plusieurs clés étrangères dans une table « enfant ». Dans SQL Server, une clé étrangère peut référencer une clé primaire ou une clé unique dans une autre table.

Qu'en est-il de l'auto-référence ?

Cela sort de la définition générale d'une clé étrangère. Une auto-référence signifie que vous pouvez attribuer une clé étrangère qui fait référence une colonne différente dans le même tableau . SQL Server, MySQL et Oracle le prennent en charge.

L'auto-référence est applicable lorsque vous souhaitez créer des hiérarchies comme la relation manager-personnel. Il est permis, encore, que la plupart des implémentations de clés étrangères soient entre 2 tables.

Plus tard, nous aurons des exemples.

4 avantages de l'utilisation de clés étrangères SQL

Explorons en détail la clé primaire et la clé étrangère dans SQL. Qu'est-ce qui rend les clés étrangères indispensables à une base de données SQL ? Examinons 4 points (ici, la syntaxe des contraintes importe peu).

1. Éviter les données "manquantes"

Les données "manquantes" sont les valeurs de clé étrangère des tables enfants sans valeurs de clé primaire associées de la table parent. Elles sont également appelées lignes orphelines. Lorsque cela se produit, nous pouvons dire que la base de données a peu ou pas d'intégrité référentielle.

Avec les contraintes de clé étrangère appliquées, les données "manquantes" ne se produiront pas du tout. Le moteur de base de données n'autorisera pas la suppression d'une valeur de clé primaire référencée par une autre table. De même, l'insertion d'une clé étrangère dans la table enfant qui n'existe pas dans les clés primaires de la table parent déclenchera une erreur.

Quelle est la pire chose qui puisse arriver si vous n'utilisez pas les contraintes de clé étrangère ? En voici quelques-unes :

  • Les clients ne recevront pas les produits pour lesquels ils ont payé.
  • Le traitement n'est pas administré aux patients.
  • Les listes de contrôle manquantes ignorent les précautions de sécurité.

Vous pouvez gérer ces éléments en dehors de la base de données, mais vous devez les coder. Plus d'informations à ce sujet suivront.

Supposons qu'un développeur de votre organisation gère la même contrainte en dehors de la base de données. Sera-t-il responsable et réglera-t-il le problème en production si le code échoue ? Je ne pense pas. Et si vous êtes l'administrateur de la base de données ? Ensuite, vous devrez nettoyer leur gâchis. Pas si encourageant si vous me demandez.

2. Évitez les rapports incohérents

Il se rapporte au premier point. Si certaines données sont « manquantes », des totaux incohérents apparaissent dans différents rapports. Les détails ne correspondent pas aux résumés. Les lignes orphelines s'ajoutent aux totaux des récapitulatifs. Pendant ce temps, le rapport détaillé n'a pas capturé les lignes orphelines en raison d'une jointure interne aux tables parentes.

Si c'est votre travail de maintenir votre base de données en bon état, vous devrez également nettoyer ce gâchis.

3. Aucun code nécessaire pour éviter les lignes orphelines

Les contraintes de clé étrangère agissent comme des agents autonettoyants. Au lieu de nettoyer le gâchis, la base de données le fait en n'autorisant pas les lignes orphelines. Les contraintes de clé étrangère agissent également comme police. Ils arrêtent la logique défectueuse à l'origine des lignes orphelines, la traitant comme un crime commis en dehors de la base de données.

Voulez-vous une base de données brillante sans lignes orphelines ? Bien sûr, vous le faites. Si vous souhaitez analyser les données un jour, vous seriez heureux d'avoir utilisé des clés étrangères. Cette base de données sera une bonne source pour copier les données nécessaires dans votre zone de transit.

4. Comprendre rapidement les relations entre les tables dans un diagramme

SQL Server Management Studio dispose d'un outil de création de diagrammes intégré pour votre base de données. Les clés primaires et étrangères rendent le diagramme de base de données informatif en un coup d'œil. Cependant, cela dépendra du nombre de tables avec des relations que vous avez incluses dans le diagramme.

Les diagrammes aident les nouveaux membres de l'équipe à comprendre la structure des données. Pour les coéquipiers seniors, cela peut aussi être utile comme documentation.

Lorsque la clé étrangère SQL peut être un "problème" (plus le correctif)

Pour migrer les anciennes données vers une nouvelle base de données, vous allez insérer des enregistrements en masse. Si la base de données source a une faible intégrité référentielle, il sera difficile d'insérer des enregistrements à partir de la source. La raison en est que des erreurs de clé étrangère apparaissent ici et là.

Existe-t-il un correctif ? Vous avez 2 options.

  1. Assurez-vous de remplir d'abord les tables de référence ou les tables parents. Après cela, remplissez les tables enfants. Une complication fonctionne très lentement. Dans d'autres cas, davantage d'erreurs de contrainte de clé étrangère se produisent. Si ce dernier cas se produit, vous devez réévaluer la séquence d'insertions et vous assurer que les clés primaires sont insérées en premier. S'il y a un problème "d'exécution lente", envisagez l'option suivante.
  2. Désactivez temporairement les clés étrangères et activez-les une fois la migration terminée (et nettoyée). Vous pouvez le faire dans SQL Server Management Studio ou utiliser T-SQL ALTER TABLE. Cependant, c'est plus facile à dire qu'à faire. À ce stade, vous avez besoin de plus de patience en plus de votre intelligence et de votre volonté. Plus tard, nous trouverons la syntaxe pour désactiver et réactiver les clés étrangères.

Une autre chose à considérer est l'utilisation d'une base de données comme zone de transit pour OLAP ou l'analyse de données. Supposons que la base de données transactionnelle source soit exempte de lignes orphelines. Ou vous pouvez réussir à éviter ces lignes via le code. Ensuite, vous pouvez choisir de ne pas utiliser de clés étrangères. Les clés étrangères ralentiront les insertions et les mises à jour en masse, en particulier sur les ensembles de données volumineux.

3 façons simples d'ajouter, de modifier et de supprimer des contraintes de clé étrangère SQL

Que faut-il pour ajouter, modifier ou supprimer des clés étrangères ? C'est facile avec ces 3 conseils.

Les deux premières étapes utilisent une interface utilisateur graphique. Des outils comme SQL Server Management Studio ou dbForge Studio pour SQL Server sont de très bons candidats. Le troisième utilisera le code T-SQL. Le choix d'un code GUI ou T-SQL dépend de la situation.

1. Utilisation du concepteur de table pour ajouter, modifier et supprimer une contrainte de clé étrangère SQL

Il est possible en SQL d'ajouter des contraintes de clé étrangère lors de la création ou de la modification d'une structure de table à l'aide de Table Designer dans SSMS. La figure 1 ci-dessous montre comment y accéder à partir du menu principal lorsque la structure du tableau est ouverte.

Une autre option consiste à cliquer avec le bouton droit n'importe où dans le concepteur de tableaux et à sélectionner Relations depuis le menu contextuel :

Une fois que vous avez sélectionné Relations , les relations de clé étrangère fenêtre apparaîtra :

Dans les relations de clé étrangère fenêtre, vous pouvez choisir d'ajouter une nouvelle clé étrangère ou de modifier/supprimer une clé existante.

Si vous choisissez d'ajouter ou de modifier, cliquez pour développer les tableaux et colonnes Caractéristiques. Cliquez ensuite sur les points de suspension bouton pour définir ou modifier les tables de clés primaires et étrangères.

De là, vous pouvez indiquer les colonnes de clé primaire et étrangère.

Après avoir défini les clés primaires et étrangères, cliquez sur OK . Revenez ensuite au concepteur de table et enregistrez les modifications.

2. Utilisation du diagramme de base de données pour ajouter, modifier et supprimer une contrainte de clé étrangère SQL

Vous pouvez utiliser le diagramme de base de données pour créer des contraintes de clé étrangère SQL. La figure 5 montre comment créer une relation entre deux tables en cliquant sur la table de clé étrangère et en la faisant glisser vers la table de clé primaire.

Lorsque vous relâchez la souris, les tableaux et colonnes fenêtre apparaîtra comme celle de la figure 4. Ensuite, vous pouvez indiquer les colonnes de clé primaire et étrangère. Cliquez ensuite sur OK.

Pour modifier une relation existante, cliquez avec le bouton droit sur une relation dans le diagramme. Sélectionnez ensuite Propriétés :

Ensuite, dans les Propriétés fenêtre, développez Tableaux et colonnes et cliquez sur les points de suspension bouton :

Après avoir cliqué sur les points de suspension bouton, les tableaux et colonnes fenêtre apparaîtra. Vous pouvez modifier les colonnes de clé primaire et étrangère (reportez-vous à nouveau à la figure 4 ci-dessus).

Pendant ce temps, supprimer une relation nécessite un clic droit sur un élément existant relation amoureuse. Sélectionnez Supprimer les relations de la base de données et cliquez sur Oui lorsque vous y êtes invité.

3. Utilisation de T-SQL pour ajouter, modifier et supprimer une contrainte de clé étrangère SQL

La troisième façon d'ajouter une clé étrangère consiste à utiliser le code T-SQL. Vous pouvez utiliser SQL CREATE TABLE et ajouter la contrainte de clé étrangère. Ou vous pouvez également utiliser ALTER TABLE pour ajouter cette contrainte après avoir créé la table.

Voici la syntaxe pour utiliser CREATE TABLE :

-- Single-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NULL REFERENCES Table1(col1)
)
GO

Après avoir défini le nom et le type de la colonne, vous pouvez ajouter des RÉFÉRENCES à une table et à une colonne. La syntaxe ci-dessus montre le tableau1 tableau sur la col1 colonne. Notez que les noms de colonne des deux tables doivent être identiques pour être valides pour les clés étrangères.

La syntaxe ci-dessus concerne les clés étrangères à une seule colonne. Si vous avez besoin de plusieurs colonnes comme clés étrangères, utilisez la clause FOREIGN KEY comme ci-dessous :

-- Multiple-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NOT NULL,
 col2 INT NOT NULL,
 col3 VARCHAR(10) NULL
 CONSTRAINT FK_Table1_Table2 FOREIGN KEY(col1, col2)
	REFERENCES Table1(col1,col2)
)
GO

Après avoir créé la table, vous pouvez ajouter des clés étrangères à l'aide de ALTER TABLE. Voici la syntaxe :

ALTER TABLE Table2 WITH CHECK ADD CONSTRAINT FK_Table1_Table2_2 FOREIGN KEY(col3)
	REFERENCES Table3(col1)
GO

Pour supprimer une contrainte de clé étrangère, vous pouvez utiliser ALTER TABLE avec DROP CONSTRAINT :

ALTER TABLE Table2 
DROP CONSTRAINT FK_Table1_Table2_2
GO

Maintenant, nous pouvons résumer 3 façons d'ajouter, de modifier et de supprimer des clés étrangères :

Exemples de contrainte de clé étrangère SQL (MySQL)

Table enfant ayant 1 référence à une table parent

-- Single Reference
CREATE TABLE [dbo].[Countries](
	[CountryID] [int] IDENTITY(1,1) NOT NULL,
	[Country] [nvarchar](50) NOT NULL,
	[ContinentID] [int] NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
	[CountryID] ASC
))
GO

ALTER TABLE [dbo].[Countries]  WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID])

GO

ALTER TABLE [dbo].[Countries] CHECK CONSTRAINT [FK_Countries_Continent]
GO

Pour visualiser cette relation, regardez la figure 9 ci-dessous :

Le ContinentID est la clé qui relie les deux tables ensemble.

Table enfant ayant plusieurs références

La voiture de sport table a plusieurs références à trois tables différentes :

-- Multiple References
CREATE TABLE [dbo].[SportsCars](
	[SportsCarID] [int] IDENTITY(1,1) NOT NULL,
	[ManufacturerID] [int] NULL,
	[StyleID] [int] NULL,
	[CountryID] [int] NULL,
	[Model] [nvarchar](50) NOT NULL,
	[Years] [varchar](50) NOT NULL,
	[Notes] [varchar](255) NOT NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_SportsCars] PRIMARY KEY CLUSTERED 
(
	[SportsCarID] ASC
))
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Country] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Manufacturer] FOREIGN KEY([ManufacturerID])
REFERENCES [dbo].[Manufacturers] ([ManufacturerID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Manufacturer]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Styles] FOREIGN KEY([StyleID])
REFERENCES [dbo].[Styles] ([StyleID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Styles]
GO

Voici comment il apparaît dans un diagramme de base de données :

Auto-référence

Les hiérarchies de postes affichent l'auto-référence dans le tableau suivant :

CREATE TABLE [dbo].[Ranks](
	[RankId] [int] IDENTITY(1,1) NOT NULL,
	[Rank] [varchar](50) NOT NULL,
	[RankLevel] [smallint] NOT NULL,
	[RankParentId] [int] NULL,
 CONSTRAINT [PK_Ranks] PRIMARY KEY CLUSTERED 
(
	[RankId] ASC
)) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Ranks] WITH CHECK ADD CONSTRAINT [FK_Ranks_Ranks] FOREIGN KEY([RankParentId])
REFERENCES [dbo].[Ranks] ([RankId])
GO

ALTER TABLE [dbo].[Ranks] CHECK CONSTRAINT [FK_Ranks_Ranks]
GO

Le schéma de cette auto-référence est simple. La ligne pointe vers la même table en auto-référence.

Avec ON UPDATE et ON DELETE

Avec ON UPDATE CASCADE, la mise à jour d'une valeur de colonne de clé primaire mettra également à jour les valeurs de clé étrangère dans les tables associées. Pendant ce temps, lorsque vous utilisez ON DELETE CASCADE, la suppression d'une clé primaire supprimera également les clés étrangères. La valeur par défaut pour ON UPDATE et ON DELETE est NO ACTION.

Voici un exemple de UPDATE et DELETE CASCADE :

ALTER TABLE [dbo].[Countries] WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE
GO

Désactiver une contrainte de clé étrangère SQL

Ce qui suit désactivera une contrainte de clé étrangère existante. Notez que la relation existe toujours.

ALTER TABLE [dbo].[SportsCars] NOCHECK CONSTRAINT [FK_SportsCars_Country]
GO

Ce n'est pas la valeur par défaut et ce n'est pas recommandé. Mais pour accélérer les insertions et les mises à jour en masse, vous pouvez temporairement désactiver la clé étrangère comme celle ci-dessus. Une fois que vous avez terminé, vous devez le rétablir à l'aide de CHECK CONSTRAINT.

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

Gotchas et correctifs

Cette section vous montrera ce qui se passe lorsque vous INSÉREZ, METTRE À JOUR ou SUPPRIMEZ des enregistrements avec des clés étrangères. Cela suppose également que les clés étrangères ne sont pas désactivées avec CONTRAINTE NOCHECK. Cela vous aidera lorsque vous rencontrerez ces problèmes courants.

Sur INSÉRER

-- This will cause an error because countryID = 47 does not exist in the Countries table
INSERT INTO SportsCars 
(ManufacturerID, StyleID, CountryID, Model, Years, Notes) 
VALUES (108, 10, 47, 'F2', '2021', 'Limited Edition')
GO

Voici le message d'erreur :

Msg 547, Level 16, State 0, Line 56
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

La solution  :Ajoutez CountryID =47 dans les pays tableau en premier. Ensuite, réexécutez l'instruction INSERT ci-dessus. La séquence commence par l'insertion d'enregistrements dans la table parent, puis dans la table enfant.

Sur MISE À JOUR

-- Update CountryID to 47 will trigger an error.
UPDATE SportsCars
SET CountryID = 47
WHERE ManufacturerID = 108
GO

Voici l'erreur de MISE À JOUR :

Msg 547, Level 16, State 0, Line 60
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

La solution  :Ajoutez CountryID =47 dans les pays table. Ensuite, réexécutez l'instruction UPDATE.

Sur SUPPRIMER

-- This will trigger an error because ManufacturerID = 108 is referenced in the SportsCars table
DELETE FROM Manufacturers
WHERE ManufacturerID = 108

Ce code déclenchera l'erreur comme ci-dessous :

Msg 547, Level 16, State 0, Line 64
The DELETE statement conflicted with the REFERENCE constraint "FK_SportsCars_Manufacturer". The conflict occurred in database "Vehicles", table "dbo.SportsCars", column 'ManufacturerID'.
The statement has been terminated.

La solution  :Supprimer les enregistrements correspondants de SportsCars table avec ManufacturerID =108. Ensuite, réexécutez l'instruction DELETE ci-dessus. Une autre méthode consiste à activer ON DELETE CASCADE, le cas échéant. La séquence commence par la suppression des enregistrements des tables enfants, puis - de la table parent.

À emporter

Alors, les clés étrangères vous sont-elles toujours étrangères ?

Récapitulons ce que nous avons appris jusqu'à présent.

  • Les clés étrangères relient deux tables (ou une table lors de l'utilisation de l'auto-référence). Vous en avez besoin pour garantir l'intégrité référentielle.
  • Vous pouvez utiliser un outil graphique ou T-SQL pour ajouter, modifier ou supprimer les contraintes de clé étrangère.
  • Pour les outils GUI, vous pouvez utiliser SQL Server Management Studio ou dbForge Studio pour SQL Server. Les deux proposent des diagrammes de base de données et des concepteurs de tables pour créer des tables avec des clés primaires et étrangères.
  • CREATE TABLE et ALTER TABLE conviennent pour ajouter et supprimer les contraintes de clé étrangère.
  • Vous pouvez temporairement désactiver les clés étrangères avec NOCHECK CONSTRAINT dans ALTER TABLE. Cela accélérera les insertions et les mises à jour en masse. Mais assurez-vous de le réactiver avec CHECK CONSTRAINT.
  • Pour éviter les pièges avec les clés étrangères, assurez-vous de suivre la bonne séquence. Pour INSERT et UPDATE, insérez d'abord dans la table parent, puis dans les tables enfant. Pour SUPPRIMER, supprimez d'abord les enregistrements enfants, puis supprimez les enregistrements parents.

Souhaitez-vous ajouter quelque chose pour aider les débutants à maîtriser les clés étrangères ? Les Commentaires La section est ouverte à vos idées lumineuses. Si vous aimez cet article, partagez-le sur vos plateformes de médias sociaux préférées.