Leer hoe u een relatie tussen twee tabellen in SQL Server maakt.
Bij relationeel databaseontwerp is een relatie is waar twee of meer tabellen aan elkaar zijn gekoppeld omdat ze gerelateerde gegevens bevatten. Hierdoor kunnen gebruikers query's uitvoeren voor gerelateerde gegevens in meerdere tabellen.
In dit deel van de zelfstudie wordt uitgelegd hoe u de volgende relaties kunt maken:
Er zijn twee relaties in dat diagram. Er is een relatie tussen de Albums
en Artists
tabellen, en er is nog een relatie tussen de Albums
en Genres
tabellen.
Door naar dat diagram te kijken, kunnen we zien dat één artiest veel albums kan hebben. In dit geval hoeven we maar één rij te hebben die de naam van de artiest bevat, ongeacht het aantal albums dat ze hebben. Dit komt omdat we een record kunnen maken in de Artists
tabel met een unieke ArtistId
. Alle albums van die artiest staan in de Albums
tabel, en ze zullen dezelfde artiest-ID bevatten in zijn eigen ArtistId
kolom. Door dit te doen, kunnen we een zoekopdracht uitvoeren in beide tabellen en de naam van de artiest retourneren, plus alle albums die ze hebben uitgebracht. Dit is het voordeel van relaties.
Eerder hebben we een database gemaakt met de bovenstaande drie tabellen. Toen we dat deden, hebben we ook een van de relaties gemaakt die in het bovenstaande diagram zijn weergegeven. We hebben de relatie gemaakt tussen de Albums
tafel en de Artists
tabel (waar de ArtistId
kolom van de Albums
tabel verwijst naar de ArtistsId
kolom van de Artists
tafel).
Dit is de code die we hebben gebruikt om de tabellen te maken:
De gemarkeerde code is het deel dat een relatie creëert tussen de Albums
tafel en de Artists
tafel. Het doet dit door de ArtistId
. in te stellen kolom van de Albums
om te verwijzen naar de ArtistId
kolom van de Artists
tafel.
Een meer technische manier om dit te zeggen is dat Albums.ArtistId
wordt een externe sleutel van Artists.ArtistId
(die zelf de primaire sleutel van die tabel is). Dit is een beperking voor een externe sleutel.
Wat is een beperking voor een externe sleutel?
Een buitenlandse sleutelbeperking definieert een relatie tussen deze tabel en een andere tabel. Wanneer u een externe sleutelbeperking maakt, maakt u deze tegen een specifieke kolom in de child tabel, om te verwijzen naar een specifieke kolom in ouder tafel.
Dit maakt die kolom in de onderliggende tabel een vreemde sleutel . De beperking zorgt ervoor dat elke waarde die in deze (vreemde sleutel) kolom gaat, overeenkomt met een waarde in de primaire sleutelkolom van de bovenliggende tabel. Als iemand een waarde probeert in te voeren die niet overeenkomt met een waarde in de primaire sleutelkolom van de bovenliggende tabel, geeft SQL Server een fout.
Dit helpt bij het afdwingen van referentiële integriteit. Het voorkomt dat we verweesde records hebben (onderliggende records die geen bovenliggende records hebben). Of in ons voorbeeld albums die niet aan een artiest zijn gekoppeld.
Als u een GUI-databasebeheertool zoals SSMS of Azure Data Studio gebruikt, wordt de relatie weergegeven onder de Keys
knooppunt voor de tabel met de externe sleutel:
Laten we de code deconstrueren:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
De eerste twee regels creëren de relatie. Ze creëren een externe sleutelbeperking tussen de
Albums.ArtistId
kolom en de
Artists.ArtistId
kolom. In dit geval noemen we de externe sleutelbeperking FK_Albums_Artists
.
De laatste twee regels geven aan wat SQL Server moet doen als iemand probeert een bovenliggende record te verwijderen of bij te werken waarnaar wordt verwezen door een record in de onderliggende tabel. In dit geval NO ACTION
betekent dat het verwijderen/bijwerken niet doorgaat. De gebruiker krijgt alleen een foutmelding.
Je zou dit kunnen veranderen in ON DELETE CASCADE
als u de ouder en het kind in één keer wilt kunnen verwijderen (d.w.z. het verwijderen gaat van de ouder naar het kind). Dezelfde logica is van toepassing op updates, door gebruik te maken van ON UPDATE CASADE
.
NO ACTION
is de standaardwaarde, dus we hadden het zonder die laatste twee regels code kunnen doen. Ik heb het echter toegevoegd, omdat het een belangrijke factor is om over na te denken bij het maken van externe sleutelbeperkingen.
Een relatie toevoegen aan een bestaande tabel
In het vorige voorbeeld wordt een relatie gemaakt op het moment dat de tabellen worden gemaakt. Het kan echter voorkomen dat u een relatie aan een bestaande tabel moet toevoegen.
Laten we een nieuwe relatie toevoegen tussen de Genres
en Albums
tabellen.
Voer de volgende code uit:
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 ;
Dit creëert een nieuwe externe sleutel op de Albums
tafel. Het resulteert in Albums.GenreId
een externe sleutel worden die verwijst naar Genres.GenreId
.
Dus het uitvoeren van die instructie resulteert in een nieuwe externe sleutel die wordt weergegeven onder de Sleutels knoop:
Enkele kolom externe sleutels
Externe sleutels met één kolom (zoals die hierboven) kunnen ook op kolomniveau worden opgegeven. Dus een andere manier om de Albums
te maken tabel en de externe sleutel is als volgt:
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 );
Deze methode kan niet worden gebruikt voor sleutelbeperkingen met meerdere kolommen, dus gebruik daarvoor de syntaxis in het originele voorbeeld hierboven.
Externe sleutels met meerdere kolommen
Een externe sleutel met meerdere kolommen is waar meer dan één kolom wordt gebruikt voor de externe sleutel. Dit wordt meestal gebruikt wanneer de bovenliggende tabel meerdere kolommen gebruikt voor de primaire sleutel. Dit kan het geval zijn als de bovenliggende tabel de waarden uit twee kolommen combineert om een unieke waarde te creëren.
Externe sleutels met meerdere kolommen kunnen worden gemaakt met behulp van de syntaxis in het originele voorbeeld hierboven. Voeg gewoon elke kolomnaam toe, gescheiden door een komma.
Dus als we ons voorstellen dat de Albums
tabel heeft ook een ArtistName
kolom (en dat de Artists
tabel gebruikt ArtistId
en ArtistName
als primaire sleutel), ziet een externe sleutel met meerdere kolommen er als volgt uit:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)