Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie eine Beziehung in SQL Server 2017

Erfahren Sie, wie Sie in SQL Server eine Beziehung zwischen zwei Tabellen erstellen.

Im relationalen Datenbankdesign eine Beziehung Hier werden zwei oder mehr Tabellen miteinander verknüpft, weil sie verwandte Daten enthalten. Dadurch können Nutzer Abfragen für verwandte Daten über mehrere Tabellen hinweg ausführen.

In diesem Teil des Tutorials wird erklärt, wie Sie die folgenden Beziehungen erstellen:

In diesem Diagramm gibt es zwei Beziehungen. Es besteht eine Beziehung zwischen den Albums und Artists Tabellen, und es gibt eine weitere Beziehung zwischen den Albums und Genres Tabellen.

Wenn wir uns dieses Diagramm ansehen, können wir sehen, dass ein Künstler viele Alben haben kann. In diesem Fall benötigen wir nur eine Zeile, die den Namen des Künstlers enthält, unabhängig davon, wie viele Alben er hat. Dies liegt daran, dass wir einen Datensatz in den Artists erstellen können Tabelle mit einer eindeutigen ArtistId . Alle Alben dieses Künstlers befinden sich in den Albums Tabelle, und sie enthalten dieselbe Künstler-ID in ihrer eigenen ArtistId Säule. Auf diese Weise können wir eine Abfrage über beide Tabellen ausführen und den Namen des Künstlers sowie alle von ihm veröffentlichten Alben zurückgeben. Das ist der Vorteil von Beziehungen.

Zuvor haben wir eine Datenbank erstellt, die die obigen drei Tabellen enthält. Dabei haben wir auch eine der im obigen Diagramm dargestellten Beziehungen erstellt. Wir haben die Beziehung zwischen den Albums erstellt Tisch und die Artists Tabelle (wobei die ArtistId Spalte der Albums Tabelle verweist auf die ArtistsId Spalte der Artists Tabelle).

Hier ist der Code, den wir ausgeführt haben, um die Tabellen zu erstellen:

Der hervorgehobene Code ist der Teil, der eine Beziehung zwischen den Albums herstellt Tisch und die Artists Tisch. Dies geschieht durch Setzen der ArtistId Spalte der Albums um auf die ArtistId zu verweisen Spalte der Artists Tabelle.

Eine technischere Art, dies auszudrücken, ist Albums.ArtistId wird zu einem Fremdschlüssel von Artists.ArtistId (was selbst der Primärschlüssel dieser Tabelle ist). Dies ist eine Fremdschlüsseleinschränkung.

Was ist eine Fremdschlüsselbeschränkung?

Eine Fremdschlüsseleinschränkung definiert eine Beziehung zwischen dieser Tabelle und einer anderen Tabelle. Wenn Sie eine Fremdschlüsseleinschränkung erstellen, erstellen Sie sie für eine bestimmte Spalte im untergeordneten Element Tabelle, um auf eine bestimmte Spalte in parent zu verweisen Tabelle.

Dadurch wird diese Spalte in der untergeordneten Tabelle zu einem Fremdschlüssel . Die Einschränkung stellt sicher, dass jeder Wert, der in diese (Fremdschlüssel-)Spalte einfließt, einem Wert in der Primärschlüsselspalte der übergeordneten Tabelle entspricht. Wenn jemand versucht, einen Wert einzugeben, der keinem Wert in der Primärschlüsselspalte der übergeordneten Tabelle entspricht, gibt SQL Server einen Fehler aus.

Dies hilft, die referenzielle Integrität zu erzwingen. Es verhindert, dass wir verwaiste Datensätze haben (untergeordnete Datensätze, die keinen übergeordneten Datensatz haben). Oder in unserem Beispiel Alben, die keinem Interpreten zugeordnet sind.

Wenn Sie ein GUI-Datenbankverwaltungstool wie SSMS oder Azure Data Studio verwenden, wird die Beziehung unter Keys angezeigt Knoten für die Tabelle mit dem Fremdschlüssel:

Lassen Sie uns den Code dekonstruieren:

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

Die ersten beiden Zeilen stellen die Beziehung her. Sie erstellen eine Fremdschlüsseleinschränkung zwischen Albums.ArtistId Spalte und die Artists.ArtistId Säule. In diesem Fall nennen wir die Fremdschlüsselbeschränkung FK_Albums_Artists .

Die letzten beiden Zeilen geben an, was SQL Server tun soll, wenn jemand versucht, einen übergeordneten Datensatz zu löschen oder zu aktualisieren, auf den von einem Datensatz in der untergeordneten Tabelle verwiesen wird. In diesem Fall NO ACTION bedeutet, dass das Löschen/Aktualisieren nicht durchgeführt wird. Der Benutzer erhält nur eine Fehlermeldung.

Sie könnten dies in ON DELETE CASCADE ändern wenn Sie in der Lage sein möchten, das Elternteil und das Kind auf einmal zu löschen (d. h. der Löschvorgang wird vom Elternteil zum Kind kaskadiert). Die gleiche Logik gilt für Updates, indem ON UPDATE CASADE verwendet wird .

NO ACTION ist der Standardwert, also hätten wir auf die letzten beiden Codezeilen verzichten können. Ich habe es jedoch aufgenommen, weil es ein wichtiger Faktor ist, über den man nachdenken muss, wenn man Fremdschlüsseleinschränkungen erstellt.

Eine Beziehung zu einer bestehenden Tabelle hinzufügen

Das vorherige Beispiel erstellt eine Beziehung gleichzeitig mit der Erstellung der Tabellen. Es kann jedoch vorkommen, dass Sie einer vorhandenen Tabelle eine Beziehung hinzufügen müssen.

Lassen Sie uns eine neue Beziehung zwischen den Genres hinzufügen und Albums Tabellen.

Führen Sie den folgenden Code aus:

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
;

Dadurch wird ein neuer Fremdschlüssel auf den Albums erstellt Tisch. Das Ergebnis ist Albums.GenreId wird zu einem Fremdschlüssel, der Genres.GenreId referenziert .

Das Ausführen dieser Anweisung führt also dazu, dass ein neuer Fremdschlüssel unter Keys angezeigt wird Knoten:

Einspaltige Fremdschlüssel

Fremdschlüssel für einzelne Spalten (wie oben) können auch auf Spaltenebene angegeben werden. Also eine andere Möglichkeit, die Albums zu erstellen Tabelle und ihr Fremdschlüssel sieht so aus:

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   
);

Diese Methode kann nicht für mehrspaltige Schlüsseleinschränkungen verwendet werden, also verwenden Sie für diese die Syntax im obigen Originalbeispiel.

Mehrspaltige Fremdschlüssel

Bei einem mehrspaltigen Fremdschlüssel wird mehr als eine Spalte für den Fremdschlüssel verwendet. Dies wird normalerweise verwendet, wenn die übergeordnete Tabelle mehrere Spalten für ihren Primärschlüssel verwendet. Dies kann der Fall sein, wenn die übergeordnete Tabelle die Werte aus zwei Spalten kombiniert, um einen eindeutigen Wert zu erstellen.

Mehrspaltige Fremdschlüssel können mit der Syntax im obigen Originalbeispiel erstellt werden. Fügen Sie einfach jeden Spaltennamen durch ein Komma getrennt hinzu.

Wenn wir uns also vorstellen, dass die Albums Die Tabelle hat auch einen ArtistName Spalte (und dass die Artists Tabelle verwendet ArtistId und ArtistName als Primärschlüssel), würde ein mehrspaltiger Fremdschlüssel so aussehen:

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