Vincoli univoci e vincoli check
Si applica a: SQL Server, Database SQL di Azure e Istanza gestita di SQL di Azure
I vincoli UNIQUE
e CHECK
sono due tipi di vincoli che possono essere utilizzati per applicare l'integrità dei dati nelle tabelle di SQL Server. Si tratta di importanti oggetti di database.
Questo articolo include le sezioni seguenti.
Vincoli UNIQUE
I vincoli sono regole applicate dal motore di database di SQL Server. È possibile ad esempio utilizzare i vincoli UNIQUE
per garantire che non vengano immessi valori duplicati in colonne specifiche che non fanno parte di una chiave primaria. Sebbene sia i vincoli UNIQUE
che i vincoli PRIMARY KEY
applichino l'univocità, utilizzare un vincolo UNIQUE
anziché un vincolo PRIMARY KEY
se si desidera applicare l'univocità di una colonna, o di una combinazione di colonne, che non costituisce la chiave primaria.
A differenza dei vincoli PRIMARY KEY
, i vincoli UNIQUE
supportano il valore NULL
. Tuttavia, come per qualsiasi valore che fa parte di un vincolo UNIQUE
, è consentito un solo valore Null per colonna. A un vincolo UNIQUE
può fare riferimento un vincolo FOREIGN KEY
.
Quando un vincolo UNIQUE
viene aggiunto a una o più colonne esistenti nella tabella, per impostazione predefinita i dati esistenti nelle colonne vengono esaminati dal motore di database per verificare che tutti i valori siano univoci. Se un vincolo UNIQUE
viene aggiunto a una colonna che contiene valori duplicati, il motore di database restituisce un errore e il vincolo non viene aggiunto.
Nel motore di database viene creato automaticamente un indice UNIQUE
per imporre il requisito di univocità del vincolo UNIQUE
. Se, pertanto, si tenta di inserire una riga duplicata, nel motore di database viene restituito un messaggio di errore che indica che il vincolo UNIQUE
è stato violato e la riga non verrà aggiunta alla tabella. Se non si specifica in modo esplicito un indice cluster, per impostazione predefinita viene creato un indice univoco non cluster per applicare il vincolo UNIQUE
.
Vincoli CHECK
I vincoli CHECK
assicurano l'integrità di dominio limitando i valori accettati da una o più colonne. È possibile creare un vincolo CHECK
con qualsiasi espressione logica (booleana) che restituisce TRUE
o FALSE
in base agli operatori logici. È ad esempio possibile limitare l'intervallo di valori di una colonna salary
creando un vincolo CHECK
che consente solo dati compresi tra 15.000 e 100.000 euro. In questo modo si evita di inserire stipendi con valori non compresi nell'intervallo regolare. L'espressione logica potrebbe essere la seguente: salary >= 15000 AND salary <= 100000
.
È possibile applicare più vincoli CHECK
a una singola colonna. È inoltre possibile applicare un singolo vincolo CHECK
a più colonne creandolo a livello di tabella. È ad esempio possibile usare un vincolo CHECK
in più colonne per confermare che a ogni riga con un valore di colonna country_region
pari a USA
corrisponda un valore di due caratteri nella colonna state
. In questo modo è possibile verificare più condizioni simultaneamente.
I vincoli CHECK
sono simili ai vincoli FOREIGN KEY
perché controllano i valori inseriti in una colonna. La differenza consiste nel modo in cui vengono determinati i valori validi. I vincoli FOREIGN KEY
ottengono l'elenco di valori validi da un'altra tabella, mentre i vincoli CHECK
determinano i valori validi da un'espressione logica.
Attenzione
I vincoli che prevedono la conversione implicita o esplicita di tipi di dati possono impedire l'esecuzione di operazioni specifiche. Ad esempio, i vincoli definiti nelle tabelle di origine per il cambio di partizione possono impedire l'esecuzione di un'operazione ALTER TABLE...SWITCH
. Evitare la conversione di tipi di dati nelle definizioni dei vincoli.
Limitazioni per i vincoli CHECK
I vincoli CHECK
non accettano i valori che restituiscono FALSE
. I valori Null restituiscono UNKNOWN e pertanto se vengono inseriti in un'espressione è possibile che un vincolo venga ignorato. Si supponga, ad esempio, di inserire un vincolo su una colonna di tipo int denominata MyColumn
e di specificare che MyColumn
possa contenere solo il valore 10 (MyColumn=10
). Se si inserisce il valore NULL
in MyColumn
, il motore di database inserisce NULL
e non restituisce un errore.
Un vincolo CHECK
restituisce TRUE
se la verifica della condizione controllata non restituisce FALSE
per nessuna riga della tabella. Un vincolo CHECK
viene utilizzato a livello di riga. Se una tabella creata non contiene righe, tutti i vincoli CHECK
sulla tabella sono considerati validi. Questa situazione può generare risultati imprevisti, come è illustrato nell'esempio seguente.
CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO
CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
DECLARE @retval INT;
SELECT @retval = COUNT(*)
FROM CheckTbl;
RETURN @retval;
END;
GO
ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO
Il vincolo CHECK
inserito specifica che deve essere presente almeno una riga nella tabella CheckTbl
. Poiché nella tabella non sono presenti righe per le quali è possibile verificare la condizione del vincolo, l'istruzione ALTER TABLE
ha tuttavia esito positivo.
I vincoli CHECK
non vengono convalidati durante le istruzioni DELETE
. L'esecuzione di istruzioni DELETE
su tabelle che includono tipi di vincoli CHECK specifici può pertanto generare risultati imprevisti. Ad esempio, si considerino le istruzioni seguenti eseguite sulla tabella CheckTbl
.
INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;
L'istruzione DELETE
ha esito positivo, anche se il vincolo CHECK
specifica che la tabella CheckTbl
deve contenere almeno 1
riga.
Nota
Se la tabella viene pubblicata per la replica, è necessario apportare modifiche allo schema usando l'istruzione ALTER TABLE di Transact-SQL oppure SMO (SQL Server Management Objects). Quando si apportano modifiche allo schema utilizzando Progettazione tabelle o Progettazione diagrammi di database, viene effettuato il tentativo di rimuovere e rigenerare la tabella. La modifica allo schema non riuscirà, poiché non è consentita la rimozione di oggetti pubblicati.
Attività correlate
Attività | Articolo |
---|---|
Viene descritto come creare un vincolo UNIQUE. | Creare vincoli UNIQUE |
Viene descritto come modificare un vincolo UNIQUE. | Modificare vincoli UNIQUE |
Viene descritto come eliminare un vincolo UNIQUE. | Eliminare vincoli UNIQUE |
Viene descritto come creare un vincolo CHECK. | Creare vincoli CHECK |
Viene descritto come disabilitare un vincolo CHECK quando un agente di replica inserisce o aggiorna i dati nella tabella. | Disabilitare un vincolo CHECK per la replica |
Viene descritto come disabilitare un vincolo CHECK quando vengono aggiunti, aggiornati o eliminati dati in una tabella. | Disabilitare i vincoli CHECK con le istruzioni INSERT e UPDATE |
Viene descritto come modificare l'espressione del vincolo o le opzioni che abilitano o disabilitano il vincolo se si verificano determinate condizioni. | Modificare vincoli CHECK |
Viene descritto come eliminare un vincolo CHECK. | Eliminare vincoli CHECK |
Viene descritto come visualizzare le proprietà di un vincolo CHECK. | Vincoli UNIQUE e CHECK |