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

Approfondimento sui vincoli univoci di SQL Server

Cosa sono i vincoli chiave univoci?

Un vincolo univoco è una regola che limita le voci di colonna a univoche. In altre parole, questo tipo di vincoli impedisce l'inserimento di duplicati in una colonna. Un vincolo univoco è uno degli strumenti per imporre l'integrità dei dati in un database di SQL Server. Poiché una tabella può avere solo una chiave primaria, puoi utilizzare un vincolo univoco per imporre l'unicità di una colonna o una combinazione di colonne che non costituiscono una chiave primaria.

La creazione di un vincolo univoco su una colonna crea automaticamente un indice univoco. In questo modo SQL Server implementa il requisito di integrità del vincolo univoco. Pertanto, quando si tenta di inserire un valore duplicato in una colonna in cui è definito un vincolo univoco, Motore di database rileverà la violazione del vincolo univoco ed emetterà un errore corrispondente. Di conseguenza, la riga con i valori duplicati non verrà aggiunta a una tabella.

Creazione di un vincolo unico

La query di esempio seguente crea gli Studenti tabella e un vincolo univoco su Login colonna in modo che non ci siano studenti con lo stesso login.

CREATE TABLE Students (
Login CHAR NOT NULL
,CONSTRAINT AK_Student_Login UNIQUE (Login)
);
GO

Se gli Studenti esiste già, quindi puoi utilizzare la seguente query di esempio per creare il vincolo univoco.

ALTER TABLE Students
ADD CONSTRAINT AK_Student_Login UNIQUE (Login);
GO

Si noti che quando si aggiunge un vincolo univoco a una tabella esistente, Motore di database verifica se la colonna a cui viene aggiunto il vincolo include valori duplicati. Se sono presenti tali valori, il vincolo non verrà aggiunto restituendo un errore.

Ora, per verificare che il vincolo univoco sia stato effettivamente aggiunto, eseguire le seguenti istruzioni:

EXEC sp_helpindex Students

EXEC sp_helpconstraint Students

Ecco il vincolo che abbiamo creato:

Creazione di un vincolo univoco in SQL Server Management Studio

Diciamo che dobbiamo definire un vincolo univoco sul Login nella colonna Studenti tabella.

1. In Esplora oggetti , fai clic con il pulsante destro del mouse su Studenti tabella e fai clic su Design .

2. Fai clic con il pulsante destro del mouse su Designer tabella e scegli Indici/Chiavi...

3. Negli Indici/Chiavi finestra, fai clic su Aggiungi .

4. Sotto il Generale sezione, fai clic su Colonne e quindi fare clic sul pulsante con i puntini di sospensione. Nelle colonne dell'indice finestra, seleziona le colonne che desideri includere nel vincolo univoco.

5. Sotto il Generale sezione, fai clic su Tipo e seleziona Chiave univoca dall'elenco a discesa.

6. Sotto l'Identità sezione, specifica il nome del vincolo (nel nostro caso, AK_Student_Login ) e fai clic su Chiudi per salvare il vincolo appena creato.

Ora, se vai a Studenti tabella in Esplora oggetti e fai clic su Indici cartella, vedrai che la tabella contiene una chiave primaria e un vincolo univoco AK_Student_Login .

In che modo i vincoli univoci sono diversi dalle chiavi primarie?

Simile a un vincolo univoco, viene utilizzata anche una chiave primaria per imporre l'integrità dei dati in una tabella. Ma lo scopo principale di una chiave primaria è identificare in modo univoco ogni record in una tabella e implementare relazioni appropriate tra le tabelle in un database. Una chiave primaria è richiesta nel 99% delle tabelle per consentire il corretto accesso alle righe della tabella. Può esserci una sola chiave primaria per tabella definita su una o più colonne.

I vincoli univoci vengono utilizzati in modo specifico per impedire l'inserimento di valori duplicati in una colonna. Potrebbero esserci diverse colonne con vincoli univoci o non esistere alcun vincolo univoco definito su una tabella. Non sono obbligatorie per una tabella al contrario delle chiavi primarie.

Diciamo che abbiamo gli Studenti tabella contenente le informazioni personali di ogni studente di un'università. La tabella include StudentID colonna che è una chiave primaria e memorizza un ID univoco di ogni studente specifico. Questa colonna della chiave primaria viene utilizzata per identificare in modo univoco ogni studente di un'università.

Allo stesso tempo, gli Studenti tabella ha colonne come Email , Numero di previdenza sociale e Accedi e ciascuna di queste colonne deve memorizzare valori univoci. Poiché nella tabella è già presente una chiave primaria, utilizzeremo invece vincoli univoci per imporre l'unicità a queste colonne. Pertanto, una tabella può avere molti vincoli univoci e una sola chiave primaria.

Un'altra cosa che differisce da un vincolo univoco da una chiave primaria è che la chiave primaria non consente alcun NULL valori in una colonna, mentre una colonna con un vincolo univoco può includere un NULL value ma solo uno poiché SQL Server interpreta due valori NULL come gli stessi valori.

Supponiamo che venga creato un vincolo univoco sull'Email colonna degli Studenti tavolo. Proviamo a inserire due righe entrambe con NULL s nell'E-mail campi:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (1, 'John White', 19, NULL, 123-45-6789, 'John555')

GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)

VALUES (2, 'James Marvin', 21, NULL, 987-65-4321, 'Marvin_J17')

GO

Otteniamo il seguente messaggio di errore:

Bene, questo è un comportamento prevedibile, perché i valori duplicati, anche se sono NULL, non sono consentiti dal vincolo univoco.

vincolo univoco vs indice univoco

Sebbene sia il vincolo univoco che l'indice univoco siano due entità di database completamente diverse e non correlate, hanno lo stesso obiettivo e lo stesso impatto sulle prestazioni di SQL ServerSQL Server. Entrambi garantiscono l'unicità dei dati in una colonna.

Tuttavia, contrariamente all'indice univoco, non è possibile specificare le opzioni IGNORE_DUP_KEY, DROP_EXISTING, PAD_INDEX e STATISTICS_NORECOMPUTE per il vincolo univoco nelle istruzioni ALTER TABLE.

Quando crei un vincolo univoco su una colonna, SQL Server crea automaticamente un indice univoco sulla colonna, questo è proprio il modo in cui questa funzionalità viene implementata in SQL Server.

Per eliminare l'indice univoco, devi prima eliminare il vincolo univoco corrispondente e questo eliminerà automaticamente l'indice univoco sottostante.

La seguente dichiarazione eliminerà AK_Student_Login vincolo:

ALTER TABLE Students 
DROP CONSTRAINT AK_Student_Login; 
GO

Puoi vederlo eliminando AK_Student_Login vincolo univoco cancella il suo indice corrispondente.

È stato facile, ora puoi inserire valori identici nel Login colonna.

Disabilitazione del vincolo univoco

C'è un'opzione che disabilita un vincolo univoco. La seguente query dovrebbe disabilitare tutti i vincoli di tabella:

ALTER TABLE Students
NOCHECK CONSTRAINT ALL
GO

Dopo aver eseguito la query, proviamo ora a inserire un record duplicato:

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, NULL, 123-45-6789, 'John555')
GO

Quello che otteniamo è il messaggio di violazione del vincolo univoco:

Pertanto, sembra che ALTER TABLE

NOCHECK CONSTRAINT ALL GO non funzioni per vincoli univoci in SQL Server.

Tuttavia, ricorda che c'è un indice univoco sotto il cofano di ogni vincolo univoco e dovremmo essere in grado di disabilitare un indice univoco. Nel nostro caso, l'AK_Student_Email il vincolo univoco ha creato l'AK_Student_Email corrispondente indice univoco nell'Email colonna. Usiamo la seguente query per disabilitare AK_Student_Email prima l'indice univoco.

ALTER INDEX AK_Student_Email ON Students
DISABLE;

La query è stata completata correttamente, quindi ora inseriamo due record con Email duplicata campi negli Studenti tabella.

INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (3, 'John White', 19, '[email protected]', 123-45-6789, 'John555')
GO
INSERT INTO Students (Student_ID, Name, Age, Email, SSN, Login)
VALUES (4, 'James Marvin', 21, '[email protected]', 987-65-4321, 'Marvin_J17')
GO

Funziona! I record sono stati inseriti nella tabella! Ora sappiamo come aggirare questo problema di "disabilitazione" con un vincolo unico.

Per abilitare l'indice, utilizza la seguente query:

ALTER INDEX AK_Student_Email ON Students
REBUILD;

Conclusione

Vincoli chiave univoci consentono ai DBA e agli sviluppatori SQL di applicare e preservare l'unicità dei dati nelle colonne della tabella, nonché di applicare determinati requisiti aziendali per l'integrità dei dati. Fondamentalmente, non c'è alcuna differenza sostanziale nel comportamento tra un vincolo univoco e un indice univoco, tranne il fatto che il vincolo univoco non può essere disabilitato direttamente e alcune opzioni di creazione dell'indice non sono disponibili per i vincoli univoci nell'istruzione ALTER TABLE.

Spero che questo articolo sia stato interessante. Puoi fare domande, lasciare commenti e suggerimenti su questo articolo.

Vedi anche: CONTROLLA i vincoli in SQL Server