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

So erstellen Sie einen zusammengesetzten Primärschlüssel in SQL Server (T-SQL-Beispiel)

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.