sql >> Database >  >> RDS >> Sqlserver

Een relatie maken in SQL Server 2017

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)

  1. Hoe waarden van XML-knooppunten opvragen?

  2. Aanbevolen procedures voor de lengte van SQL-varchar-kolommen

  3. Trigram Jokertekenreeks zoeken in SQL Server

  4. MariaDB RONDE() vs VLOER()