"Vad är skillnaden mellan en primärnyckelrestriktion och en unik nyckelrestriktion?"
Detta är förmodligen den vanligaste anställningsintervjufrågan för databasutvecklare. I den här artikeln kommer vi att försöka svara på det.
Låt oss börja med att titta på vad primära och unika nycklar är, samt på deras likheter.
Primär nyckel
En primärnyckel används för att unikt identifiera varje post i tabellen. Varje tabell måste ha minst en primärnyckel. För att definiera en primärnyckel i SQL-servern behöver du helt enkelt använda nyckelorden "Primärnyckel" efter kolumnens namn.
Unik nyckel
En kolumn med en unik nyckelbegränsning kan bara innehålla unika värden – detta är resultatet av den unika nyckeln som förbjuder dubbletter av värden att lagras i en kolumn.
För att definiera en unik nyckel måste du lägga till "Unik" till namnet på fältet. Tänk på att det inte är obligatoriskt att ha en unik nyckel i en tabell.
Exempel på att skapa primära och unika nycklar
Följande skript skapar en 'Test'-databas som innehåller en tabell som heter 'Bilar'.
Den här tabellen kommer att ha en primärnyckelkolumn med namnet "ID" och en unik nyckelkolumn med namnet "Nummerplåt".
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 );
Låt oss sedan lägga till några dummy-rekord i vår "Bilar"-tabell. Kör följande skript:
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)
Innan vi pratar om skillnaderna, låt oss först titta på likheterna mellan primära och unika nycklar.
Likheter mellan primära och unika nycklar
- Kolumner med primära eller unika nycklar kan inte ha dubbletter av värden.
Låt oss försöka lägga till en ny post med ett ID-värde på 2 (som redan finns) i tabellen "Bilar". Kör följande skript:
INSERT INTO Cars VALUES (2, 'Toyota', 'ABC 345', 356)
När du kör skriptet ovan kommer följande fel att visas:
Felet säger tydligt att detta uttalande bryter mot primärnyckelns begränsning och att dubbletter av värden inte kan infogas i primärnyckelkolumnen.
På samma sätt, låt oss försöka infoga ett dubblettvärde i kolumnen "Nummerplåt" med en unik nyckelbegränsning genom att använda följande fråga:
INSERT INTO Cars VALUES (6, 'Toyota', 'ABC 345', 356)
Den här gången kommer du att se att det finns ett brott mot den unika nyckelbegränsningen eftersom värdet 'ABC 345' redan finns i kolumnen 'Nummerplåt' som har en unik nyckelbegränsning. Felmeddelandet kommer att se ut så här:
- Eftersom både primärnyckel och unika kolumner inte accepterar dubbletter av värden kan de användas för att unikt identifiera en post i tabellen. Detta innebär att för varje värde i den primära eller unika nyckelkolumnen kommer endast en post att returneras.
Skillnader mellan primära och unika nycklar
Nu när vi förstår likheterna mellan primära och unika nycklar, låt oss ta en titt på deras skillnader.
- En tabell kan bara ha en primärnyckel, men flera unika nycklar.
Följande exempel hjälper oss att förstå detta bättre.
Inuti "Test"-databasen vi gjorde tidigare, låt oss skapa en ny "Cars2"-tabell med två primärnycklar. För att göra detta, kör följande skript:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int PRIMARY KEY );
I skriptet ovan ställer vi in primärnyckelbegränsningar på ID- och Model-kolumnerna. Men eftersom endast en kolumn i en tabell kan ha en primärnyckelbegränsning, kommer du att se följande fel:
Detta felmeddelande informerar oss tydligt om att en tabell inte kan ha flera primärnyckelbegränsningar.
Låt oss nu lägga till flera unika nyckelbegränsningar i tabellen "Cars2". Ta en titt på följande skript:
CREATE TABLE Cars2 ( ID int PRIMARY KEY, Name varchar(255) NOT NULL, NumberPlate varchar(255) UNIQUE, Model int UNIQUE );
Detta gör att vi kan lägga till unika nyckelbegränsningar i kolumnerna "Nummerplåt" och "Model". Eftersom en tabell kan ha flera kolumner med unika nyckelbegränsningar, kommer du inte att se några felmeddelanden när du kör ovanstående skript.
- Primärnyckelkolumnen kan inte ha nullvärden medan Unique Key-kolumnen kan ha ett nullvärde.
Låt oss se detta i aktion. Låt oss först lägga till en post med ett nollvärde till en primärnyckelkolumn i tabellen "Bilar". Titta på skriptet nedan:
INSERT INTO Cars VALUES ( null, 'Toyota', 'ABC 345', 356)
Du kan se att det här skriptet infogar null som ett värde i ID-kolumnen. När du kör det bör du se följande fel i utdatameddelandefönstret:
Felet talar om för oss att ett nollvärde inte kan infogas eftersom primärnyckelkolumnen inte tillåter nollvärden.
Låt oss nu försöka lägga till nollvärden till den unika nyckelkolumnen "Nummerplåt". För att göra detta, kör följande skript:
INSERT INTO Cars VALUES ( 6, 'Toyota',null, 356)
Detta lägger till en ny post med ett ID-värde på 6 och ett nollvärde till tabellen "Bilar" – närmare bestämt tilldelas nollvärdet till kolumnen "Nummerplåt". Du kommer att se att skriptet ovan kommer att köras utan fel eftersom den unika nyckelkolumnen kan acceptera nollvärden som standard.
För att verifiera om nollvärdet verkligen har infogats i kolumnen 'Nummerplåt' måste vi välja alla poster från tabellen 'Bilar' med hjälp av följande skript:
SELECT * FROM Cars
I resultatuppsättningen ovan kan vi tydligt se att primärnyckelkolumnen 'ID' inte inte innehåller några nullvärden. Å andra sidan innehåller kolumnen 'NumberPlate' med en unik nyckelbegränsning ett nollvärde som vi precis infogade. Kom ihåg att du inte kan lägga till mer än ett nollvärde i en unik nyckelkolumn eftersom det andra nollvärdet kommer att vara dubbletten av det första – och dubbletter är inte tillåtna.
- Som standard skapas ett unikt klustrat index i primärnyckelkolumnen; å andra sidan skapas ett unikt icke-klustrat index i kolumnen för unika nyckel.
För att se indexen i tabellen 'Bilar', kör följande skript:
USE TEST GO sp_help Cars
I utgången kommer du att se detaljer i tabellen "Bilar" inklusive indexen som visas i figuren nedan:
Från figuren ovan kan du se att kolumnen "Nummerplåt" har ett icke-klustrat unikt index medan ID-kolumnen har ett klustrat unikt index.
Slutsats
Trots några grundläggande likheter har primära och unika nycklar betydande skillnader. Du kan bara ha en primärnyckel per tabell, men flera unika nycklar. På samma sätt accepterar inte en primärnyckelkolumn nollvärden, medan unika nyckelkolumner kan innehålla ett nollvärde var. Och slutligen har den primära nyckelkolumnen ett unikt klustrat index medan en unik nyckelkolumn har ett unikt icke-klustrat index.