sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan opretter du en sammensat primær nøgle i SQL Server (T-SQL-eksempel)

En sammensat primær nøgle er en primær nøgle bestående af flere kolonner. Microsoft refererer normalt til disse som primærnøgler med flere kolonner i sin dokumentation.

Denne artikel giver et eksempel på oprettelse af en sammensat primærnøgle ved hjælp af Transact-SQL i SQL Server.

Du kan oprette en sammensat primærnøgle, ligesom du ville oprette en enkelt primærnøgle, bortset fra at du i stedet for kun at angive én kolonne angiver navnet på to eller flere kolonner, adskilt af et komma.

Sådan:

CONSTRAINT PK_Name PRIMÆR NØGLE (Kolonne1, Kolonne2)

Eksempel 1 – Opret en sammensat primær nøgle

Her er et eksempel på en database, der bruger en sammensat primærnøgle.

Til formålet med dette eksempel vil jeg oprette en database kaldet PK_Test :

OPRET DATABASE PK_Test;

Nu hvor databasen er oprettet, lad os gå videre og oprette tabellerne.

BRUG PK_Test;CREATE TABLE Musiker (MusicianId int NOT NULL,FirstName varchar(60),Efternavn varchar(60),CONSTRAINT PK_Musician PRIMARY KEY (MusicianID));CREATE TABLE Band (BandId int NOT NULL,Band5) varchar(25) ,CONSTRAINT PK_Band PRIMARY KEY (BandId));CREATE TABLE BandMember (MusicianId int NOT NULL,BandId int NOT NULL,CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),CONSTRAINT FK_BandMember_Band_Band_Band_BandForIGNd(MusicianBand_Band_Band_BandForIGNd) KEY (MusicianId) REFERENCER Musician(MusicianId));

I dette eksempel er BandMember tabellen har en primær nøgle med flere kolonner. I dette tilfælde er hver kolonne i den primære nøgle også en fremmednøgle til den primære nøgle i en anden tabel, men dette er ikke et krav.

Begrundelsen bag ovenstående databasedesign er, at en musiker potentielt kan være medlem af mange bands. Desuden kan hvert band have mange musikere. Så vi har et mange-til-mange forhold. Det er derfor BandMember tabel oprettes – den bruges som en krydsreferencetabel mellem Musician tabellen og Band bord.

Dette særlige tilfælde understøtter en sammensat primær toneart, fordi en musiker, der er medlem af et band, burde være en unik begivenhed. Med andre ord ville vi ikke have flere rækker, hvor en musiker er medlem af det samme band. Det ville krænke dataintegriteten. Det kan også forårsage kaos, når vi forsøger at bevare referentiel integritet, selv om vi nogensinde skaber et forhold mellem denne tabel og en anden (hvilket vi gør her).

Eksempel 2 – Indsæt data

Efter lige at have kørt ovenstående kode, kan jeg nu indlæse databasen med data:

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

Eksempel 3 – Grundlæggende forespørgsel

Nu hvor data er i vores database, lad os køre en forespørgsel for at returnere nogle af disse data.

Her er en grundlæggende forespørgsel:

SELECT CONCAT(m.FirstName, ' ', m.LastName) AS 'Musician', b.BandName AS 'Band'FROM Musician mJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b ON b.BandId =bm .BandId OG m.MusicianId =bm.MusicianId;

Resultat:

+------------------+-------------+| Musiker | Bånd ||-----------------+------------|| Ian Paice | Deep Purple || Ian Paice | Hvidslange || Roger Glover | Deep Purple || Roger Glover | Regnbue || Richie Blackmore | Deep Purple || Richie Blackmore | Regnbue || Rod Evans | Deep Purple |+-------------------+--------------+

Så som forventet returnerer dette kun de musikere og bands, der har en post i BandMember referencetabel.

Eksempel 4 – Lidt ændret forespørgsel

Her er en ændret version af ovenstående forespørgsel, der præsenterer resultaterne på en anden måde:

SELECT b.BandName AS 'Band', STRING_AGG(CONCAT(m.FirstName, ' ', m.LastName), ', ') AS 'Musicians'FROM Musician MJOIN BandMember bm ON m.MusicianId =bm.MusicianIdJOIN Band b PÅ b.BandId =bm.BandId OG m.MusicianId =bm.MusicianIdGROUP BY b.BandName;

Resultat:

+-------------+-------------------------------- ----------------------+| Band | Musikere ||-------------+---------------------------------------- --------------------|| Deep Purple | Ian Paice, Roger Glover, Richie Blackmore, Rod Evans || Regnbue | Roger Glover, Richie Blackmore || Hvidslange | Ian Paice |+-------------+-------------------------------- ----------------------+

Her er resultaterne grupperet efter band, og alle musikere for hvert band vises alle som en kommasepareret liste i et enkelt felt.

For at gøre dette bruger jeg STRING_AGG() funktion til at sammenkæde musikerne.

Sammensat fremmednøgle

Problemet med ovenstående eksempel er, at de fleste data er forældede. Nogle af disse musikere har faktisk forladt disse bands. Og nogle er rejst og vendte så tilbage på et senere tidspunkt.

Hvordan kan vi håndtere dette?

Vi kunne oprette en anden referencetabel for at registrere den tidsperiode, hver musiker er medlem af hvert band. En sådan tabel skal referere til BandMember tabel via en fremmednøgle. Og da denne tabel har en sammensat primær nøgle, skal vi bruge en sammensat fremmednøgle på den nye tabel, der refererer til den.

Se Sådan opretter du en sammensat fremmednøgle i SQL Server for et eksempel. Denne artikel bruger det samme eksempel som ovenfor, undtagen med en ekstra tabel med en sammensat fremmednøgle, der refererer til ovenstående sammensatte primærnøgle.


  1. Opret kun en tabel, hvis den ikke findes i MariaDB

  2. Hvordan opretter man en SQL-visning med SQLAlchemy?

  3. Opdel ord med stort bogstav i sql

  4. Masseindsæt felter med fast bredde