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)