Ein zusammengesetzter Primärschlüssel ist ein Primärschlüssel, der aus mehreren Spalten besteht. Microsoft bezeichnet diese in der Dokumentation in der Regel als mehrspaltige Primärschlüssel.
Dieser Artikel enthält ein Beispiel für das Erstellen eines zusammengesetzten Primärschlüssels mit Transact-SQL in SQL Server.
Sie können einen zusammengesetzten Primärschlüssel genauso erstellen wie einen einzelnen Primärschlüssel, mit der Ausnahme, dass Sie statt nur einer Spalte die Namen von zwei oder mehr Spalten angeben, getrennt durch ein Komma.
So:
CONSTRAINT PK_Name PRIMÄRSCHLÜSSEL (Spalte1, Spalte2)
Beispiel 1 – Erstellen Sie einen zusammengesetzten Primärschlüssel
Hier ist ein Beispiel für eine Datenbank, die einen zusammengesetzten Primärschlüssel verwendet.
Für dieses Beispiel erstelle ich eine Datenbank namens PK_Test :
DATENBANK PK_Test ERSTELLEN;
Nachdem die Datenbank nun erstellt wurde, können wir mit dem Erstellen der Tabellen fortfahren.
USE PK_Test;CREATE TABLE Musiker (MusicianId int NOT NULL,FirstName varchar(60),LastName varchar(60),CONSTRAINT PK_Musician PRIMARY KEY (MusicianID));CREATE TABLE Band (BandId int NOT NULL,BandName varchar(255) ,CONSTRAINT PK_Band PRIMARY KEY (BandId));CREATE TABLE BandMember (MusicianId int NOT NULL,BandId int NOT NULL,CONSTRAINT PK_BandMember PRIMARY KEY (MusikerID, BandId),CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId),CONSTRAINT FK_BandMember_Musician FOREIGN SCHLÜSSEL (MusicianId) REFERENZEN Musiker(MusicianId));
In diesem Beispiel das BandMember
Tabelle hat einen mehrspaltigen Primärschlüssel. In diesem Fall ist jede Spalte im Primärschlüssel auch ein Fremdschlüssel zum Primärschlüssel einer anderen Tabelle, aber das ist keine Voraussetzung.
Der Grund für das obige Datenbankdesign ist, dass ein Musiker möglicherweise Mitglied vieler Bands sein könnte. Außerdem kann jede Band viele Musiker haben. Wir haben also eine Viele-zu-Viele-Beziehung. Aus diesem Grund ist BandMember
Tabelle erstellt – sie dient als Querverweistabelle zwischen dem Musician
Tabelle und das Band
Tisch.
Dieser spezielle Fall unterstützt einen zusammengesetzten Primärschlüssel, da ein Musiker, der Mitglied einer Band ist, ein einzigartiges Ereignis sein sollte. Mit anderen Worten, wir möchten nicht, dass mehrere Reihen mit einem Musiker Mitglied derselben Band sind. Das würde die Datenintegrität verletzen. Es könnte auch Chaos verursachen, wenn wir versuchen, die referenzielle Integrität aufrechtzuerhalten, selbst wenn wir jemals eine Beziehung zwischen dieser Tabelle und einer anderen erstellen (was wir hier tun).
Beispiel 2 – Daten einfügen
Nachdem ich gerade den obigen Code ausgeführt habe, kann ich jetzt die Datenbank mit Daten laden:
INSERT INTO MusicianVALUES ( 1, 'Ian', 'Paice' ),( 2, 'Roger', 'Glover' ),( 3, 'Richie', 'Blackmore' ),( 4, 'Rod', ' Evans' ),( 5, 'Ozzy', 'Osbourne' ); INSERT INTO BandVALUES ( 1, 'Deep Purple' ),( 2, 'Rainbow' ),( 3, 'Whitesnake' ),( 4, 'Iron Maiden ' );INSERT INTO BandMemberVALUES ( 1, 1 ),( 1, 3 ),( 2, 1 ),( 2, 2 ),( 3, 1 ),( 3, 2 ),( 4, 1 );Beispiel 3 – Grundlegende Abfrage
Nachdem sich die Daten nun in unserer Datenbank befinden, führen wir eine Abfrage aus, um einige dieser Daten zurückzugeben.
Hier ist eine einfache Abfrage:
SELECT CONCAT(m.FirstName, ' ', m.LastName) AS 'Musiker', b.BandName AS 'Band'FROM Musiker mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm .BandId UND m.MusicianId =bm.MusicianId;Ergebnis:
+-------------+------------+| Musiker | Band ||-----+------------|| Ian Pace | Dunkelviolett || Ian Pace | Weiße Schlange || Roger Glover | Dunkelviolett || Roger Glover | Regenbogen || Richie Blackmore | Dunkelviolett || Richie Blackmore | Regenbogen || Rod Evans | Deep Purple |+-------------+------------+Das gibt also erwartungsgemäß nur die Musiker und Bands zurück, die einen Eintrag im
BandMember
haben Referenztabelle.Beispiel 4 – Leicht modifizierte Abfrage
Hier ist eine modifizierte Version der obigen Abfrage, die die Ergebnisse anders darstellt:
SELECT b.BandName AS 'Band', STRING_AGG(CONCAT(m.FirstName, ' ', m.LastName), ', ') AS 'Musicians'FROM Musiker mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm.BandId AND m.MusicianId =bm.MusicianIdGROUP BY b.BandName;Ergebnis:
+-------------+------------------------------- ----------------------+| Band | Musiker ||-------------+-------------------------------- ---------------------|| Dunkelviolett | Ian Paice, Roger Glover, Richie Blackmore, Rod Evans || Regenbogen | Roger Glover, Richie Blackmore || Weiße Schlange | Ian Pace |+-------------+------------------------------- -----------------------+Hier werden die Ergebnisse nach Band gruppiert und alle Musiker für jede Band werden als kommaseparierte Liste in einem einzigen Feld angezeigt.
Dazu verwende ich den
STRING_AGG()
Funktion, um die Musiker zu verketten.Zusammengesetzter Fremdschlüssel
Das Problem mit dem obigen Beispiel ist, dass die meisten Daten veraltet sind. Einige dieser Musiker haben diese Bands tatsächlich verlassen. Und einige sind gegangen und zu einem späteren Zeitpunkt zurückgekehrt.
Wie können wir damit umgehen?
Wir könnten eine weitere Referenztabelle erstellen, um den Zeitraum aufzuzeichnen, in dem jeder Musiker Mitglied jeder Band ist. Eine solche Tabelle müsste auf
BandMember
verweisen Tabelle über einen Fremdschlüssel. Und da diese Tabelle einen zusammengesetzten Primärschlüssel hat, müssten wir einen zusammengesetzten Fremdschlüssel für die neue Tabelle verwenden, die darauf verweist.Ein Beispiel finden Sie unter So erstellen Sie einen zusammengesetzten Fremdschlüssel in SQL Server. Dieser Artikel verwendet das gleiche Beispiel wie oben, außer mit einer zusätzlichen Tabelle mit einem zusammengesetzten Fremdschlüssel, der auf den obigen zusammengesetzten Primärschlüssel verweist.