"Hvad er forskellen mellem en primær nøglebegrænsning og en unik nøglebegrænsning?"
Dette er sandsynligvis det hyppigst stillede jobsamtalespørgsmål for databaseudviklere. I denne artikel vil vi forsøge at besvare det.
Lad os starte med at se på, hvad primære og unikke nøgler er, samt på deres ligheder.
Primær nøgle
En primær nøgle bruges til entydigt at identificere hver post i tabellen. Hver tabel skal have mindst én primær nøgle. For at definere en primærnøgle i SQL-serveren skal du blot bruge nøgleordene 'Primærnøgle' efter kolonnens navn.
Unik nøgle
En kolonne med en unik nøglebegrænsning kan kun indeholde unikke værdier – dette er resultatet af den unikke nøgle, der forbyder duplikerede værdier, der skal gemmes i en kolonne.
For at definere en unik nøgle skal du tilføje 'Unik' til navnet på feltet. Husk, at det ikke er obligatorisk at have en unik nøgle i en tabel.
Eksempel på oprettelse af primære og unikke nøgler
Følgende script opretter en 'Test'-database, som indeholder en tabel kaldet 'Biler'.
Denne tabel vil have en primær nøglekolonne med navnet 'ID' og en unik nøglekolonne med navnet 'Nummerplade'.
CREATE DATABASE TEST GO USE TEST GO CREATE TABLE Cars ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int );
Lad os derefter tilføje et par dummy-records til vores 'Biler'-tabel. Udfør følgende script:
INSERT INTO Cars VALUES (1, 'Toyota', 'ABC 123', 199), (2, 'Toyota', 'ABC 345', 207), (3, 'Toyota', 'ABC 758', 205), (4, 'Toyota', 'ABC 741', 306), (5, 'Toyota', 'ABC 356', 124)
Før vi taler om forskellene, lad os først se på lighederne mellem primære og unikke nøgler.
Ligheder mellem primære og unikke nøgler
- Kolonner med primære eller unikke nøgler kan ikke have duplikerede værdier.
Lad os prøve at tilføje en ny post med en ID-værdi på 2 (som allerede eksisterer) til 'Biler'-tabellen. Udfør følgende script:
INSERT INTO Cars VALUES (2, 'Toyota', 'ABC 345', 356)
Når du udfører scriptet ovenfor, vil følgende fejl blive vist:
Fejlen siger tydeligt, at denne sætning overtræder den primære nøglebegrænsning, og at duplikerede værdier ikke kan indsættes i den primære nøglekolonnen.
Lad os på samme måde prøve at indsætte en dubletværdi i kolonnen 'Nummerplade' med en unik nøglebegrænsning ved at bruge følgende forespørgsel:
INSERT INTO Cars VALUES (6, 'Toyota', 'ABC 345', 356)
Denne gang vil du se, at der er en overtrædelse af den unikke nøglebegrænsning, da værdien 'ABC 345' allerede eksisterer i 'Nummerplade'-kolonnen, som har en unik nøglebegrænsning. Fejlmeddelelsen vil se sådan ud:
- Da både primærnøgle og unikke kolonner ikke accepterer duplikerede værdier, kan de bruges til entydigt at identificere en post i tabellen. Det betyder, at for hver værdi i den primære eller unikke nøglekolonne, vil der kun blive returneret én post.
Forskelle mellem primære og unikke nøgler
Nu hvor vi forstår lighederne mellem primære og unikke nøgler, lad os tage et kig på deres forskelle.
- En tabel kan kun have én primær nøgle, men flere unikke nøgler.
Følgende eksempel vil hjælpe os med at forstå dette bedre.
Inde i 'Test'-databasen, vi lavede tidligere, lad os oprette en ny 'Cars2'-tabel med to primære nøgler. For at gøre dette skal du udføre følgende script:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int PRIMARY KEY );
I scriptet ovenfor sætter vi primære nøglebegrænsninger på ID- og Model-kolonnerne. Men da kun én kolonne i en tabel kan have en primær nøglebegrænsning, vil du se følgende fejl:
Denne fejlmeddelelse informerer os tydeligt om, at en tabel ikke kan have flere primære nøglebegrænsninger.
Lad os nu tilføje flere unikke nøglebegrænsninger til 'Cars2'-tabellen. Tag et kig på følgende script:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int UNIQUE );
Dette giver os mulighed for at tilføje unikke nøglebegrænsninger på kolonnerne 'Nummerplade' og 'Model'. Da en tabel kan have flere kolonner med unikke nøglebegrænsninger, vil du ikke se nogen fejlmeddelelser, når du udfører ovenstående script.
- Den primære nøglekolonne kan ikke have nulværdier, mens kolonnen Unik nøgle kan have én nullværdi.
Lad os se dette i aktion. Lad os først tilføje en post med en nulværdi til en primær nøglekolonne i 'Biler'-tabellen. Se på scriptet nedenfor:
INSERT INTO Cars VALUES ( null, 'Toyota', 'ABC 345', 356)
Du kan se, at dette script indsætter null som en værdi i ID-kolonnen. Når du udfører det, bør du se følgende fejl i outputmeddelelsesvinduet:
Fejlen fortæller os, at en null-værdi ikke kan indsættes, da den primære nøglekolonne ikke tillader null-værdier.
Lad os nu prøve at tilføje nulværdier til den unikke nøglekolonne 'Nummerplade'. For at gøre dette skal du udføre følgende script:
INSERT INTO Cars VALUES ( 6, 'Toyota',null, 356)
Dette tilføjer en ny post med en ID-værdi på 6 og null-værdi til 'Biler'-tabellen - specifikt er null-værdien tildelt kolonnen 'Nummerplade'. Du vil se, at ovenstående script vil blive eksekveret uden fejl, da den unikke nøglekolonne kan acceptere null-værdier som standard.
For at bekræfte, om null-værdien faktisk er blevet indsat i kolonnen 'Nummerplade', skal vi vælge alle poster fra tabellen 'Biler' ved at bruge følgende script:
SELECT * FROM Cars
I resultatsættet ovenfor kan vi tydeligt se, at den primære nøglekolonne 'ID' ikke 't indeholder nogen null-værdier. På den anden side indeholder kolonnen 'Nummerplade' med en unik nøglebegrænsning en nulværdi, som vi lige har indsat. Husk, du kan ikke tilføje mere end én null-værdi til en unik nøglekolonne, da den anden null-værdi vil være duplikatet af den første – og dubletter er ikke tilladt.
- Som standard oprettes et unikt klynget indeks i den primære nøglekolonne; på den anden side oprettes et unikt ikke-klynget indeks på den unikke nøglekolonne.
For at se indekserne på 'Biler'-tabellen skal du udføre følgende script:
USE TEST GO sp_help Cars
I outputtet vil du se detaljer om 'Biler'-tabellen inklusive indekserne som vist i figuren nedenfor:
Fra figuren ovenfor kan du se, at kolonnen 'Nummerplade' har et ikke-klynget unikt indeks, mens ID-kolonnen har et klynget unikt indeks.
Konklusion
På trods af nogle få grundlæggende ligheder har primære og unikke nøgler betydelige forskelle. Du kan kun have én primær nøgle pr. tabel, men flere unikke nøgler. På samme måde accepterer en primær nøglekolonne ikke null-værdier, mens unikke nøglekolonner kan indeholde én null-værdi hver. Og endelig har den primære nøglekolonne et unikt klynget indeks, mens en unik nøglekolonne har et unikt ikke-klynget indeks.