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

Créer une relation dans SQL Server 2017

Découvrez comment créer une relation entre deux tables dans SQL Server.

Dans la conception de bases de données relationnelles, une relation est l'endroit où deux tables ou plus sont liées entre elles parce qu'elles contiennent des données liées. Cela permet aux utilisateurs d'exécuter des requêtes pour des données associées sur plusieurs tables.

Cette partie du tutoriel explique comment créer les relations suivantes :

Il y a deux relations dans ce diagramme. Il existe une relation entre les Albums et Artists tables, et il existe une autre relation entre les Albums et Genres tableaux.

En regardant ce diagramme, nous pouvons voir qu'un artiste peut avoir plusieurs albums. Dans ce cas, nous n'avons besoin que d'une seule ligne contenant le nom de l'artiste, quel que soit le nombre d'albums qu'il possède. C'est parce que nous pouvons créer un enregistrement dans les Artists tableau avec un ArtistId unique . Tous les albums de cet artiste résideront dans Albums table, et ils contiendront le même identifiant d'artiste dans son propre ArtistId colonne. En faisant cela, nous pouvons exécuter une requête sur les deux tables et renvoyer le nom de l'artiste, ainsi que tous les albums qu'il a publiés. C'est l'avantage des relations.

Auparavant, nous avons créé une base de données contenant les trois tables ci-dessus. Lorsque nous avons fait cela, nous avons également créé l'une des relations décrites dans le diagramme ci-dessus. Nous avons créé la relation entre les Albums tableau et les Artists table (où le ArtistId colonne des Albums table référence le ArtistsId colonne des Artists tableau).

Voici le code que nous avons exécuté pour créer les tables :

Le code en surbrillance est la partie qui crée une relation entre les Albums tableau et les Artists table. Il le fait en définissant le ArtistId colonne des Albums pour référencer le ArtistId colonne des Artists tableau.

Une façon plus technique de dire cela est que Albums.ArtistId devient une clé étrangère de Artists.ArtistId (qui est elle-même la clé primaire de cette table). Il s'agit d'une contrainte de clé étrangère.

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

Une contrainte de clé étrangère définit une relation entre cette table et une autre table. Lorsque vous créez une contrainte de clé étrangère, vous la créez par rapport à une colonne spécifique dans l'enfant table, pour référencer une colonne spécifique dans parent tableau.

Cela fait de cette colonne de la table enfant une clé étrangère . La contrainte garantit que toute valeur qui entre dans cette colonne (clé étrangère) correspond à une valeur dans la colonne de clé primaire de la table parent. Si quelqu'un essaie d'entrer une valeur qui ne correspond pas à une valeur dans la colonne de clé primaire de la table parent, SQL Server génère une erreur.

Cela permet de renforcer l'intégrité référentielle. Cela nous empêche d'avoir des enregistrements orphelins (enregistrements enfants qui n'ont pas de parent). Ou dans notre exemple, des albums qui ne sont associés à aucun artiste.

Si vous utilisez un outil de gestion de base de données GUI comme SSMS ou Azure Data Studio, la relation apparaîtra sous les Keys nœud pour la table avec la clé étrangère :

Déconstruisons le code :

CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId)     
    REFERENCES dbo.Artists (ArtistId)     
    ON DELETE NO ACTION    
    ON UPDATE NO ACTION

Les deux premières lignes créent la relation. Ils créent une contrainte de clé étrangère entre Albums.ArtistId et la colonne Artists.ArtistId colonne. Dans ce cas, nous appelons la contrainte de clé étrangère FK_Albums_Artists .

Les deux dernières lignes spécifient ce que SQL Server doit faire si quelqu'un essaie de supprimer ou de mettre à jour un enregistrement parent qui est référencé par un enregistrement dans la table enfant. Dans ce cas, NO ACTION signifie que la suppression/mise à jour n'aura pas lieu. L'utilisateur obtiendra simplement une erreur.

Vous pouvez le remplacer par ON DELETE CASCADE si vous souhaitez pouvoir supprimer le parent et l'enfant en une seule fois (c'est-à-dire que la suppression se fera en cascade du parent à l'enfant). La même logique s'applique aux mises à jour, en utilisant ON UPDATE CASADE .

NO ACTION est la valeur par défaut, nous aurions donc pu nous passer de ces deux dernières lignes de code. Cependant, je l'ai inclus, car c'est un facteur important à prendre en compte lors de la création de contraintes de clé étrangère.

Ajouter une relation à une table existante

L'exemple précédent crée une relation en même temps que les tables sont créées. Cependant, il peut arriver que vous ayez besoin d'ajouter une relation à une table existante.

Ajoutons une nouvelle relation entre les Genres et Albums tableaux.

Exécutez le code suivant :

USE Music;   
ALTER TABLE Albums
ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId)     
	REFERENCES dbo.Genres (GenreId)     
	ON DELETE NO ACTION    
	ON UPDATE NO ACTION
;

Cela crée une nouvelle clé étrangère sur les Albums table. Il en résulte Albums.GenreId devenir une clé étrangère qui référence Genres.GenreId .

Ainsi, l'exécution de cette instruction entraîne l'affichage d'une nouvelle clé étrangère sous les Keys noeud :

Clés étrangères à une seule colonne

Les clés étrangères à colonne unique (comme celle ci-dessus) peuvent également être spécifiées au niveau de la colonne. Donc une autre façon de créer les Albums table et sa clé étrangère ressemble à ceci :

CREATE TABLE Albums (
  AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
  AlbumName nvarchar(255) NOT NULL,
  ReleaseDate date NOT NULL,
  ArtistId int NOT NULL
		REFERENCES Artists(ArtistId),
  GenreId int NOT NULL   
);

Cette méthode ne peut pas être utilisée sur des contraintes de clé multicolonnes, donc pour celles-ci, utilisez la syntaxe de l'exemple d'origine ci-dessus.

Clés étrangères multicolonnes

Une clé étrangère multicolonne est l'endroit où plus d'une colonne est utilisée pour la clé étrangère. Ceci est généralement utilisé lorsque la table parent utilise plusieurs colonnes pour sa clé primaire. Cela peut être le cas si la table parent combine les valeurs de deux colonnes pour créer une valeur unique.

Des clés étrangères multicolonnes peuvent être créées à l'aide de la syntaxe de l'exemple original ci-dessus. Ajoutez simplement chaque nom de colonne séparé par une virgule.

Donc, si nous imaginons que les Albums la table a aussi un ArtistName colonne (et que la colonne Artists le tableau utilise ArtistId et ArtistName comme clé primaire), une clé étrangère multicolonne ressemblerait à ceci :

CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName)     
    REFERENCES dbo.Artists (ArtistId, ArtistName)