sql >> Database >  >> RDS >> Database

Het verschil tussen primaire sleutel en unieke sleutel

"Wat is het verschil tussen een primaire sleutelbeperking en een unieke sleutelbeperking?"

Dit is waarschijnlijk de meest gestelde sollicitatievraag voor databaseontwikkelaars. In dit artikel zullen we proberen het te beantwoorden.

Laten we beginnen met te kijken naar wat primaire en unieke sleutels zijn, en ook naar hun overeenkomsten.

Primaire sleutel

Een primaire sleutel wordt gebruikt om elk record in de tabel op unieke wijze te identificeren. Elke tabel moet ten minste één primaire sleutel hebben. Om een ​​primaire sleutel in de SQL-server te definiëren, hoeft u alleen de trefwoorden 'Primaire sleutel' achter de naam van de kolom te gebruiken.

Unieke sleutel

Een kolom met een unieke sleutelbeperking kan alleen unieke waarden bevatten. Dit is het resultaat van de unieke sleutel die verbiedt dat dubbele waarden in een kolom worden opgeslagen.

Om een ​​unieke sleutel te definiëren, moet u 'Uniek' toevoegen aan de naam van het veld. Houd er rekening mee dat het niet verplicht is om een ​​unieke sleutel in een tabel te hebben.

Voorbeeld van het maken van primaire en unieke sleutels

Het volgende script creëert een 'Test'-database die één tabel met de naam 'Auto's' bevat.

Deze tabel heeft een primaire sleutelkolom met de naam 'ID' en een unieke sleutelkolom met de naam 'NumberPlate'.

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

Laten we vervolgens een paar dummy-records toevoegen aan onze tabel 'Auto's'. Voer het volgende script uit:

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)

Laten we, voordat we het over de verschillen hebben, eerst kijken naar de overeenkomsten tussen primaire en unieke sleutels.

Overeenkomsten tussen primaire en unieke sleutels

  1. Kolommen met primaire of unieke sleutels mogen geen dubbele waarden hebben.

Laten we proberen een nieuw record met een ID-waarde van 2 (die al bestaat) toe te voegen aan de tabel 'Auto's'. Voer het volgende script uit:

INSERT INTO Cars
VALUES 
(2, 'Toyota', 'ABC 345', 356)

Wanneer u het bovenstaande script uitvoert, wordt de volgende fout weergegeven:

De fout geeft duidelijk aan dat deze instructie de primaire-sleutelbeperking schendt en dat dubbele waarden niet in de primaire-sleutelkolom kunnen worden ingevoegd.

Laten we op dezelfde manier proberen een dubbele waarde in te voegen in de kolom 'NumberPlate' met een unieke sleutelbeperking door de volgende query te gebruiken:

INSERT INTO Cars
VALUES 
(6, 'Toyota', 'ABC 345', 356)

Deze keer zult u zien dat de unieke sleutelbeperking wordt geschonden, aangezien de waarde 'ABC 345' al bestaat in de kolom 'NumberPlate' die een unieke sleutelbeperking heeft. De foutmelding ziet er als volgt uit:

  1. Omdat zowel de primaire sleutel als de unieke kolommen geen dubbele waarden accepteren, kunnen ze worden gebruikt om een ​​record in de tabel uniek te identificeren. Dit betekent dat voor elke waarde in de primaire of unieke sleutelkolom slechts één record wordt geretourneerd.

Verschillen tussen primaire en unieke sleutels

Nu we de overeenkomsten tussen primaire en unieke sleutels begrijpen, gaan we eens kijken naar hun verschillen.

  1. Een tabel kan maar één primaire sleutel hebben, maar meerdere unieke sleutels.

Het volgende voorbeeld zal ons helpen dit beter te begrijpen.

Laten we in de 'Test'-database die we eerder hebben gemaakt een nieuwe 'Cars2'-tabel maken met twee primaire sleutels. Voer hiervoor het volgende script uit:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int PRIMARY KEY
);

In het bovenstaande script stellen we primaire sleutelbeperkingen in op de ID- en Modelkolommen. Aangezien echter slechts één kolom in een tabel een primaire sleutelbeperking kan hebben, ziet u de volgende fout:

Deze foutmelding laat ons duidelijk weten dat een tabel niet meerdere primaire sleutelbeperkingen kan hebben.

Laten we nu meerdere unieke sleutelbeperkingen toevoegen aan de tabel 'Cars2'. Bekijk het volgende script:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int UNIQUE
);

Dit stelt ons in staat om unieke sleutelbeperkingen toe te voegen aan de kolommen 'NumberPlate' en 'Model'. Aangezien een tabel meerdere kolommen kan hebben met unieke sleutelbeperkingen, ziet u geen foutmeldingen bij het uitvoeren van het bovenstaande script.

  1. De kolom met de primaire sleutel mag geen null-waarden hebben, terwijl de kolom Unieke sleutel één null-waarde kan hebben.

Laten we dit in actie zien. Laten we eerst een record met een null-waarde toevoegen aan een primaire sleutelkolom in de tabel 'Auto's'. Bekijk het onderstaande script:

INSERT INTO Cars
VALUES 
( null, 'Toyota', 'ABC 345', 356)

U kunt zien dat dit script null invoegt als een waarde in de ID-kolom. Wanneer u het uitvoert, zou u de volgende fout in het uitvoerberichtvenster moeten zien:

De fout vertelt ons dat een null-waarde niet kan worden ingevoegd omdat de primaire sleutelkolom geen null-waarden toestaat.

Laten we nu proberen null-waarden toe te voegen aan de unieke sleutelkolom 'NumberPlate'. Voer hiervoor het volgende script uit:

INSERT INTO Cars
VALUES 
( 6, 'Toyota',null, 356)

Dit voegt een nieuw record toe met een ID-waarde van 6 en een null-waarde aan de tabel 'Auto's' - in het bijzonder wordt de null-waarde toegewezen aan de kolom 'NumberPlate'. U zult zien dat het bovenstaande script zonder fouten wordt uitgevoerd, aangezien de unieke sleutelkolom standaard null-waarden kan accepteren.

Om te controleren of de null-waarde daadwerkelijk is ingevoegd in de 'NumberPlate'-kolom, moeten we alle records uit de 'Cars'-tabel selecteren met behulp van het volgende script:

SELECT * FROM Cars


In de bovenstaande resultatenset kunnen we duidelijk zien dat de primaire sleutelkolom 'ID' niet bevatten geen null-waarden. Aan de andere kant bevat de kolom 'NumberPlate' met een unieke sleutelbeperking wel een null-waarde die we zojuist hebben ingevoegd. Onthoud dat u niet meer dan één null-waarde aan een unieke sleutelkolom kunt toevoegen, aangezien de tweede null-waarde het duplicaat is van de eerste - en duplicaten zijn niet toegestaan.

  1. Standaard wordt er een unieke geclusterde index gemaakt op de primaire sleutelkolom; aan de andere kant wordt een unieke niet-geclusterde index gemaakt op de unieke sleutelkolom.

Voer het volgende script uit om de indexen in de tabel 'Auto's' te zien:

USE TEST
GO
sp_help Cars

In de uitvoer ziet u details van de tabel 'Auto's' inclusief de indices zoals weergegeven in de onderstaande afbeelding:

In de bovenstaande afbeelding kunt u zien dat de kolom 'NumberPlate' een niet-geclusterde unieke index heeft, terwijl de ID-kolom een ​​geclusterde unieke index heeft.

Conclusie

Ondanks enkele fundamentele overeenkomsten, hebben primaire en unieke sleutels aanzienlijke verschillen. U kunt slechts één primaire sleutel per tabel hebben, maar meerdere unieke sleutels. Evenzo accepteert een primaire sleutelkolom geen null-waarden, terwijl unieke sleutelkolommen elk één null-waarde kunnen bevatten. En tot slot heeft de primaire sleutelkolom een ​​unieke geclusterde index, terwijl een unieke sleutelkolom een ​​unieke niet-geclusterde index heeft.


  1. Hoe gegevens van de laatste 7 dagen te krijgen van de huidige datetime tot de laatste 7 dagen op de sql-server

  2. Verbeteringen in voortgangsrapportage in PostgreSQL 12

  3. Lumen - Databaseverbinding maken tijdens runtime

  4. Word lid van het Q&A-forum voor ontwikkelaars