Database
 sql >> Database >  >> RDS >> Database

La differenza tra chiave primaria e chiave univoca

"Qual è la differenza tra un vincolo di chiave primaria e un vincolo di chiave univoca?"

Questa è probabilmente la domanda di colloquio di lavoro più frequente per gli sviluppatori di database. In questo articolo cercheremo di rispondere.

Iniziamo osservando quali sono le chiavi primarie e univoche, nonché le loro somiglianze.

Chiave primaria

Una chiave primaria viene utilizzata per identificare in modo univoco ogni record nella tabella. Ogni tabella deve avere almeno una chiave primaria. Per definire una chiave primaria in SQL Server, devi semplicemente utilizzare le parole chiave "Chiave primaria" dopo il nome della colonna.

Chiave univoca

Una colonna con un vincolo di chiave univoca può contenere solo valori univoci:questo è il risultato della chiave univoca che vieta la memorizzazione di valori duplicati all'interno di una colonna.

Per definire una chiave univoca, devi aggiungere "Unico" al nome del campo. Tieni presente che non è obbligatorio avere una chiave univoca in una tabella.

Esempio di creazione di chiavi primarie e univoche

Lo script seguente crea un database "Test" che contiene una tabella chiamata "Cars".

Questa tabella avrà una colonna di chiave primaria denominata "ID" e una colonna di chiave univoca denominata "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
);

Successivamente, aggiungiamo alcuni record fittizi alla nostra tabella "Auto". Esegui il seguente 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)

Prima di parlare delle differenze, diamo un'occhiata alle somiglianze tra le chiavi primarie e univoche.

Somiglianze tra chiavi primarie e univoche

  1. Le colonne con chiavi primarie o univoche non possono avere valori duplicati.

Proviamo ad aggiungere un nuovo record con un valore ID di 2 (che esiste già) alla tabella "Auto". Esegui il seguente script:

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

Quando esegui lo script sopra, verrà visualizzato il seguente errore:

L'errore dice chiaramente che questa istruzione viola il vincolo della chiave primaria e che i valori duplicati non possono essere inseriti nella colonna della chiave primaria.

Allo stesso modo, proviamo a inserire un valore duplicato nella colonna "NumberPlate" con un vincolo di chiave univoco utilizzando la seguente query:

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

Questa volta, vedrai che c'è una violazione del vincolo di chiave univoca poiché il valore "ABC 345" esiste già nella colonna "NumberPlate" che ha un vincolo di chiave univoco. Il messaggio di errore sarà simile al seguente:

  1. Poiché sia ​​la chiave primaria che le colonne univoche non accettano valori duplicati, possono essere utilizzate per identificare in modo univoco un record nella tabella. Ciò significa che, per ogni valore nella colonna della chiave primaria o univoca, verrà restituito un solo record.

Differenze tra chiavi primarie e univoche

Ora che comprendiamo le somiglianze tra chiavi primarie e univoche, diamo un'occhiata alle loro differenze.

  1. Una tabella può avere solo una chiave primaria, ma più chiavi univoche.

L'esempio seguente ci aiuterà a capirlo meglio.

All'interno del database "Test" creato in precedenza, creiamo una nuova tabella "Cars2" con due chiavi primarie. Per fare ciò, esegui il seguente script:

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

Nello script sopra, impostiamo i vincoli della chiave primaria sulle colonne ID e Modello. Tuttavia, poiché solo una colonna in una tabella può avere un vincolo di chiave primaria, vedrai il seguente errore:

Questo messaggio di errore ci informa chiaramente che una tabella non può avere più vincoli di chiave primaria.

Ora aggiungiamo più vincoli chiave univoci alla tabella "Cars2". Dai un'occhiata al seguente script:

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

Ciò ci consente di aggiungere vincoli chiave univoci alle colonne "NumberPlate" e "Model". Poiché una tabella può avere più colonne con vincoli di chiave univoci, non vedrai alcun messaggio di errore durante l'esecuzione dello script precedente.

  1. La colonna della chiave primaria non può avere valori nulli mentre la colonna della chiave univoca può avere un valore nullo.

Vediamo questo in azione. Innanzitutto, aggiungiamo un record con un valore nullo a una colonna della chiave primaria nella tabella "Auto". Guarda lo script qui sotto:

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

Puoi vedere che questo script inserisce null come valore nella colonna ID. Quando lo esegui, dovresti vedere il seguente errore nella finestra del messaggio di output:

L'errore indica che non è possibile inserire un valore nullo poiché la colonna della chiave primaria non consente valori nulli.

Proviamo ora ad aggiungere valori nulli alla colonna della chiave univoca "NumberPlate". Per fare ciò, esegui il seguente script:

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

Questo aggiunge un nuovo record con un valore ID di 6 e un valore nullo alla tabella "Cars", in particolare, il valore null viene assegnato alla colonna "NumberPlate". Vedrai che lo script precedente verrà eseguito senza errori poiché la colonna della chiave univoca può accettare valori nulli per impostazione predefinita.

Per verificare se il valore nullo è stato effettivamente inserito nella colonna "NumberPlate", dovremo selezionare tutti i record dalla tabella "Cars" utilizzando il seguente script:

SELECT * FROM Cars


Nel set di risultati sopra, possiamo vedere chiaramente che la colonna della chiave primaria 'ID' non 'non contiene alcun valore nullo. D'altra parte, la colonna "NumberPlate" con un vincolo di chiave univoco contiene un valore nullo che abbiamo appena inserito. Ricorda, non puoi aggiungere più di un valore nullo a una colonna chiave univoca poiché il secondo valore nullo sarà il duplicato del primo e i duplicati non sono consentiti.

  1. Per impostazione predefinita, nella colonna della chiave primaria viene creato un indice cluster univoco; d'altra parte, viene creato un indice univoco non cluster sulla colonna della chiave univoca.

Per visualizzare gli indici nella tabella "Auto", eseguire il seguente script:

USE TEST
GO
sp_help Cars

Nell'output, vedrai i dettagli della tabella "Auto" inclusi gli indici come mostrato nella figura seguente:

Dalla figura sopra, puoi vedere che la colonna "NumberPlate" ha un indice univoco non in cluster mentre la colonna ID ha un indice univoco in cluster.

Conclusione

Nonostante alcune somiglianze di base, le chiavi primarie e univoche presentano differenze significative. Puoi avere solo una chiave primaria per tabella, ma più chiavi univoche. Allo stesso modo, una colonna di chiave primaria non accetta valori null, mentre le colonne di chiavi univoche possono contenere un valore null ciascuna. Infine, la colonna della chiave primaria ha un indice cluster univoco mentre una colonna della chiave univoca ha un indice non cluster univoco.