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

Comment créer une table avec plusieurs clés étrangères et ne pas être confus

Comprendre les relations entre les tables

Le serveur SQL ajoute des clés étrangères pour implémenter des relations entre les tables dans une base de données relationnelle. Une table peut avoir des relations un-à-un, un-à-plusieurs ou plusieurs-à-plusieurs avec une autre table, selon le type de données que vous souhaitez stocker.

Une relation un à un est simple et rarement utilisée. Chaque enregistrement dans une table particulière se rapporte à exactement un enregistrement dans une autre table.

Par exemple, vous pouvez stocker le nom, l'identifiant et le sexe de l'utilisateur dans une table (Utilisateur table) et leurs adresses seront stockées dans les différentes tables (Adresse table). Chaque enregistrement dans Utilisateur table correspondra à un enregistrement dans l'Adresse table. A l'inverse, chaque adresse dans l'Adresse la table appartiendra à un seul enregistrement dans l'Utilisateur tableau.

Les relations un-à-plusieurs et plusieurs-à-plusieurs sont beaucoup plus fréquentes.

Imaginez un scénario dans lequel vous stockez des informations sur les employés, les services, les compagnies d'assurance des employés et les adresses des bureaux des employés d'une organisation.

Nous partons du principe qu'un salarié ne peut appartenir qu'à un seul service et ne peut souscrire qu'à une seule compagnie d'assurance. Cependant, les ministères et les compagnies d'assurance peuvent avoir plusieurs employés. Le Département et Employé les tables auraient une relation un-à-plusieurs. De même, l'Assurance et les tableaux des employés aurait une relation un-à-plusieurs.

En outre, l'organisation peut avoir plusieurs bureaux et un employé peut travailler dans plusieurs bureaux. De plus, un bureau peut avoir plusieurs employés. Dans ce cas, le Bureau et Employé les tables auraient une relation plusieurs à plusieurs.

Pour implémenter la relation plusieurs-à-plusieurs, vous devez créer une table de recherche qui relie deux tables dans une relation plusieurs-à-plusieurs. Les tables d'origine contiennent une relation un-à-plusieurs avec la table de recherche.

Envisageons de créer une relation plusieurs-à-plusieurs entre l'Employé et Bureau les tables. Vous créeriez une nouvelle table de recherche Employee_Office . Ensuite, vous créez une relation un-à-plusieurs entre l'Employé et Employee_Office tables et le Bureau et Employee_Office tableaux.

Voyons maintenant comment les clés étrangères s'intègrent dans cette discussion.

Que sont les clés étrangères et pourquoi avez-vous besoin de plusieurs clés étrangères ?

Dans les bases de données relationnelles, les clés étrangères implémentent différents types de relations de base de données.

Par exemple, pour implémenter une relation un-à-plusieurs dans SQL Server, vous devez ajouter une clé étrangère dans une table qui se trouve sur le many côtés de la relation un-à-plusieurs.

La clé étrangère fait référence à la clé primaire ou à la clé d'identité unique de la table qui se trouve sur une côté du tableau. Ainsi, dans une relation un-à-plusieurs entre le Département et Employé tables dont nous avons parlé ci-dessus, l'Employé table stockera une clé étrangère qui fait référence à la clé primaire du Département tableau.

Dans les scénarios où une table peut avoir des relations avec plusieurs autres tables, vous devrez ajouter plusieurs clés étrangères à une table. Pour l'Employé table, vous devez ajouter des clés étrangères qui référencent les clés primaires du Département tableau et l'Assurance table. De même, le Employee_Office la table de recherche aura deux clés étrangères qui référencent les clés primaires de l'Employé et Bureau tableaux.

Ajout de plusieurs clés étrangères avec SQL Server

Le schéma suivant montre le schéma de base de données que vous allez implémenter pour notre exemple simple :

Ici, vous pouvez voir que la base de données comporte cinq tables :Employé , Assurance , Département , Bureau , et Employee_Office .

Le Département et Employé les tables ont une relation un-à-plusieurs. De même, l'Assurance et Employé les tables ont également une relation un-à-plusieurs. Le bureau et les tables Employee ont une relation plusieurs-à-plusieurs implémentée à l'aide de deux relations un-à-plusieurs avec Employee_Office table de recherche.

L'Employé la table a deux clés étrangères, Dep_Id , et Insur_Id qui font référence aux clés primaires (Id) du Département et Assurance tables, respectivement.

Exécutons maintenant le script SQL qui crée la base de données décrite.

Commencez par créer des tables sans aucune clé étrangère. Si vous essayez de créer des tables avec des clés étrangères qui font référence à d'autres tables qui ne sont pas encore créées, vous obtiendrez une erreur.

Dans notre schéma de base de données, le Département , Organisation , et Bureau les tables n'ont pas de clés étrangères. Le script suivant crée une base de données factice nommée Organisation et y ajoute trois tables :Département , Assurance , et Bureau .

CREATE DATABASE Organization

USE Organization
CREATE TABLE Department
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Insurance
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Office
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

Vous pouvez utiliser les RÉFÉRENCES DE CLÉ ÉTRANGÈRE contrainte pour implémenter une relation de clé étrangère dans SQL Server. Spécifiez le nom du tableau. Spécifiez ensuite entre parenthèses le nom de la colonne de la clé étrangère pour y faire référence.

Le script suivant crée l'Employé table avec clés étrangères Dep_Id et Insur_Id qui font référence aux colonnes d'ID dans le Department et Assurance tables respectivement.

USE Organization
CREATE TABLE Employee
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Age INT,
Gender VARCHAR (50),
Dep_Id int FOREIGN KEY REFERENCES Department(Id),
Insur_Id int FOREIGN KEY REFERENCES Insurance(Id)
)

Enfin, le script suivant crée le Employee_Office table avec deux clés étrangères Emp_Id et Office_Id .

USE Organization
CREATE TABLE Employee_Office
(
Id INT PRIMARY KEY IDENTITY(1,1),
Emp_Id int FOREIGN KEY REFERENCES Employee(Id),
Office_Id int FOREIGN KEY REFERENCES Office(Id)
)

Insérer des enregistrements dans des tables avec plusieurs clés étrangères

Pour insérer des enregistrements dans des tables avec plusieurs clés étrangères, vous devez d'abord créer des enregistrements correspondants dans les tables qui sont référencés par des clés étrangères dans les tables d'origine.

En pratique, pour insérer des enregistrements dans le champ Employé table, nous devons d'abord créer les enregistrements correspondants dans le Département et Assurance les tables. C'est parce que l'Employé la table contient des clés étrangères référençant le Département et Assurance tableaux.

Tout d'abord, nous essayons d'ajouter des enregistrements dans le champ Employé table sans spécifier les clés étrangères référençant le Department et Employé tableaux.

INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')

Vous verrez l'erreur suivante. Cela se produit parce que le nombre de valeurs spécifiées ne correspond pas au nombre de colonnes dans Employé tableau.

Essayons d'ajouter des valeurs factices pour le Dep_Id et Insur_Id colonnes (clés étrangères) :

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Vous verrez l'erreur suivante puisque les tables Département et Assurance n'ont pas d'enregistrements avec les identifiants 2 et 1, respectivement.

Insérons maintenant des enregistrements dans le Département , Assurance , et Bureau tableaux :

INSERT INTO Department
VALUES (1, 'Finance'),
(2, 'HR')

INSERT INTO Insurance
VALUES (1, 'Company A'),
(2, 'Company B')

INSERT INTO Office
VALUES (1, 'Paris'),
(2, 'London')

Depuis le Département et Assurance les tables ont maintenant des enregistrements avec les identifiants 2 et 1, vous pouvez insérer des enregistrements dans le Employé tables avec les valeurs de clé étrangère correspondantes, comme indiqué ci-dessous :

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Insérez des enregistrements dans Employee_Office table. Mais avant cela, voyons les valeurs de la colonne Id dans la table Employee :

SELECT * FROM Employee

L'Employé la colonne contient des enregistrements avec des valeurs d'ID de 2 et 3. Vous pouvez insérer des enregistrements dans Employee_Office table où le Emp_Id la colonne contient 2 ou 3, et le Office_Id la colonne contient 1 ou 2.

INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)

Sélectionner des enregistrements dans des tables avec plusieurs clés étrangères

Pour sélectionner des enregistrements dans des tables avec plusieurs clés étrangères, vous avez besoin de JOIN.

Le script suivant renvoie les valeurs du Nom et Sexe colonnes de l'Employé table et le Nom colonnes du Département et tableaux d'assurance. Depuis l'Employé table contient deux clés étrangères, vous devez utiliser deux LEFT JOIN déclarations :

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Department.Name as Department_Name, 
Insurance.Name as Insurance

FROM Employee
LEFT JOIN Department ON Employee.Dep_Id  =  Department.Id
LEFT JOIN Insurance  ON Employee.Insur_Id = Insurance.Id

De la même manière, vous pouvez sélectionner les valeurs du Nom et Sexe colonnes de l'Employé table et le Nom colonne du Bureau table à l'aide de deux instructions LEFT JOIN sur la table de recherche Employee_Office .

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Office.Name as Office_Name

FROM Employee
LEFT JOIN Employee_Office ON Employee.Id  =  Employee_Office.Emp_Id
LEFT JOIN Office  ON Office.Id = Employee_Office.Office_Id

SUPPRIMER des enregistrements de tables avec plusieurs clés étrangères

Vous pouvez supprimer des enregistrements de tables avec plusieurs clés étrangères. Cependant, assurez-vous que la table n'est pas référencée par une clé étrangère dans une autre colonne.

Par exemple, vous ne devez pas supprimer les enregistrements du Service table référencée par Emp_Id clé étrangère dans Employee table. Voici un exemple :

DELETE FROM Department WHERE Id = 1

Depuis l'enregistrement avec l'Id 1 dans le Département la table est référencée par Emp_Id colonne dans la colonne Employé table, vous ne pouvez pas la supprimer comme mentionné dans l'erreur ci-dessus. Tout d'abord, vous devez supprimer tous les enregistrements de l'Employé table où Emp_Id est 1.

La table Employee ne contient qu'un seul enregistrement de ce type (avec la valeur Id de 3). Essayons de supprimer cet enregistrement avec la requête suivante :

DELETE FROM Employee WHERE Id = 3

Vous verrez l'erreur qui se produit parce que Employee_Office contient un enregistrement où Emp_Id la colonne de clé étrangère contient 3 enregistrements. Par conséquent, vous devrez d'abord supprimer cet enregistrement :

Le script suivant supprime l'enregistrement avec Emp_Id valeur de 3 du Employee_Office tableau.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Enfin, le script suivant supprime l'enregistrement avec des valeurs d'ID de 1 de l'Employé et Département colonnes.

DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1

Conclusion

Ainsi, nous avons examiné l'ajout de plusieurs clés étrangères dans les tables SQL Server en utilisant les requêtes SQL pour ajouter des clés étrangères. J'espère que ces exemples pratiques utilisés dans l'article vous ont également aidé à maîtriser ce sujet.

Lorsque vous traitez des clés étrangères et des dépendances de table pour effectuer les tâches de travail, il est également utile d'utiliser les outils logiciels pour simplifier les routines. Le diagramme de base de données visuel est fortement recommandé en tant que solution dédiée pour afficher toutes les dépendances entre les tables. De plus, vous pouvez générer une documentation précise pour l'ensemble de la base de données, quelle que soit sa complexité, grâce à la fonctionnalité Database Documenter.

Ces deux outils visent à réduire la charge manuelle, à automatiser les processus et à accélérer les performances pour vous soulager d'un certain fardeau.