Vincoli UNIQUE e CHECKUnique Constraints and Check Constraints

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2008)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

I vincoli UNIQUE e CHECK sono due tipi di vincoli che possono essere utilizzati per applicare l'integrità dei dati nelle tabelle di SQL ServerSQL Server .UNIQUE constraints and CHECK constraints are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Si tratta di importanti oggetti di database.These are important database objects.

In questo argomento sono contenute le sezioni seguenti.This topic contains the following sections.

Vincoli UNIQUEUNIQUE Constraints

Vincoli CHECKCHECK Constraints

Attività correlateRelated Tasks

Vincoli UNIQUE UNIQUE Constraints

I vincoli sono regole attivate dal Motore di database di SQL ServerSQL Server Database Engine .Constraints are rules that the Motore di database di SQL ServerSQL Server Database Engine enforces for you. È 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.For example, you can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. 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.Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key.

A differenza dei vincoli PRIMARY KEY, i vincoli UNIQUE supportano il valore NULL.Unlike PRIMARY KEY constraints, UNIQUE constraints allow for the value NULL. Tuttavia, come per qualsiasi valore che fa parte di un vincolo UNIQUE, è consentito un solo valore Null per colonna.However, as with any value participating in a UNIQUE constraint, only one null value is allowed per column. A un vincolo UNIQUE può fare riferimento un vincolo FOREIGN KEY.A UNIQUE constraint can be referenced by a FOREIGN KEY constraint.

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 databaseDatabase Engine per verificare che tutti i valori siano univoci.When a UNIQUE constraint is added to an existing column or columns in the table, by default, the Motore di databaseDatabase Engine examines the existing data in the columns to make sure all values are unique. Se un vincolo UNIQUE viene aggiunto a una colonna che contiene valori duplicati, Motore di databaseDatabase Engine restituisce un errore e il vincolo non viene aggiunto.If a UNIQUE constraint is added to a column that has duplicated values, the Motore di databaseDatabase Engine returns an error and does not add the constraint.

In Motore di databaseDatabase Engine viene creato automaticamente un indice UNIQUE per imporre il requisito di univocità del vincolo UNIQUE.The Motore di databaseDatabase Engine automatically creates a UNIQUE index to enforce the uniqueness requirement of the UNIQUE constraint. Se, pertanto, si tenta di inserire una riga duplicata, in Motore di databaseDatabase Engine viene restituito un messaggio di errore che indica che il vincolo UNIQUE è stato violato e che la riga non verrà aggiunta alla tabella.Therefore, if an attempt to insert a duplicate row is made, the Motore di databaseDatabase Engine returns an error message that states the UNIQUE constraint has been violated and does not add the row to the table. 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.Unless a clustered index is explicitly specified, a unique, nonclustered index is created by default to enforce the UNIQUE constraint.

Vincoli CHECK CHECK Constraints

I vincoli CHECK assicurano l'integrità di dominio limitando i valori accettati da una o più colonne.CHECK constraints enforce domain integrity by limiting the values that are accepted by one or more columns. È possibile creare un vincolo CHECK con qualsiasi espressione logica (booleana) che restituisce TRUE o FALSE in base agli operatori logici.You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators. È 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.For example, the range of values for a salary column can be limited by creating a CHECK constraint that allows for only data that ranges from $15,000 through $100,000. In questo modo si evita di inserire stipendi con valori non compresi nell'intervallo regolare.This prevents salaries from being entered beyond the regular salary range. L'espressione logica potrebbe essere la seguente: salary >= 15000 AND salary <= 100000.The logical expression would be the following: salary >= 15000 AND salary <= 100000.

È possibile applicare più vincoli CHECK a una colonnaYou can apply multiple CHECK constraints to a single column. e inoltre applicare un singolo vincolo CHECK a più colonne creandolo a livello di tabella.You can also apply a single CHECK constraint to multiple columns by creating it at the table level. È 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 .For example, a multiple-column CHECK constraint could be used to confirm that any row with a country_region column value of USA also has a two-character value in the state column. In questo modo è possibile verificare più condizioni simultaneamente.This allows for multiple conditions to be checked in one location.

I vincoli CHECK simili ai vincoli FOREIGN KEY perché controllano i valori inseriti in una colonna.CHECK constraints are similar to FOREIGN KEY constraints in that they control the values that are put in a column. 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.The difference is in how they determine which values are valid: FOREIGN KEY constraints obtain the list of valid values from another table, while CHECK constraints determine the valid values from a logical expression.

Attenzione

I vincoli che prevedono la conversione implicita o esplicita di tipi di dati possono impedire l'esecuzione di operazioni specifiche.Constraints that include implicit or explicit data type conversion may cause certain operations to fail. Ad esempio, i vincoli definiti nelle tabelle di origine per il cambio di partizione possono impedire l'esecuzione di un'operazione ALTER TABLE...SWITCH.For example, such constraints defined on tables that are sources of partition switching may cause an ALTER TABLE...SWITCH operation to fail. Evitare la conversione di tipi di dati nelle definizioni dei vincoli.Avoid data type conversion in constraint definitions.

Limitazioni per i vincoli CHECKLimitations of CHECK Constraints

I vincoli CHECK non accettano i valori che restituiscono FALSE.CHECK constraints reject values that evaluate to FALSE. I valori Null restituiscono UNKNOWN e pertanto se vengono inseriti in un'espressione è possibile che un vincolo venga ignorato.Because null values evaluate to UNKNOWN, their presence in expressions may override a constraint. 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.For example, suppose you place a constraint on an int column MyColumn specifying that MyColumn can contain only the value 10 (MyColumn=10). Se si inserisce il valore NULL in MyColumn, Motore di databaseDatabase Engine inserisce NULL e non restituisce un errore.If you insert the value NULL into MyColumn, the Motore di databaseDatabase Engine inserts NULL and does not return an error.

Un vincolo CHECK restituisce TRUE se la verifica della condizione controllata non restituisce FALSE per nessuna riga della tabella.A CHECK constraint returns TRUE when the condition it is checking is not FALSE for any row in the table. Un vincolo CHECK viene utilizzato a livello di riga.A CHECK constraint works at the row level. Se una tabella appena creata non contiene righe, tutti i vincoli CHECK sulla tabella sono considerati validi.If a table that has just been created does not have any rows, any CHECK constraint on this table is considered valid. Questa situazione può generare risultati imprevisti, come è illustrato nell'esempio seguente.This situation can produce unexpected results, as in the following example.

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.The CHECK constraint being added specifies that there must be at least one row in table 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.However, because there are no rows in the table against which to check the condition of this constraint, the ALTER TABLE statement succeeds.

I vincoli CHECK non vengono convalidati durante l'esecuzione di istruzioni DELETE.CHECK constraints are not validated during DELETE statements. L'esecuzione di istruzioni DELETE su tabelle che includono tipi di vincoli CHECK specifici può pertanto generare risultati imprevisti.Therefore, executing DELETE statements on tables with certain types of check constraints may produce unexpected results. Ad esempio, si considerino le istruzioni seguenti eseguite sulla tabella CheckTbl.For example, consider the following statements executed on table 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.The DELETE statement succeeds, even though the CHECK constraint specifies that table CheckTbl must have at least 1 row.

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).If the table is published for replication, you must make schema changes using the Transact-SQL statement ALTER TABLE or SQL Server Management Objects (SMO). Quando si apportano modifiche allo schema utilizzando Progettazione tabelle o Progettazione diagrammi di database, viene effettuato il tentativo di rimuovere e rigenerare la tabella.When schema changes are made using the Table Designer or the Database Diagram Designer, it attempts to drop and recreate the table. La modifica allo schema non riuscirà, poiché non è consentita la rimozione di oggetti pubblicati.You cannot drop published objects, therefore the schema change will fail.

AttivitàTask ArgomentoTopic
Viene descritto come creare un vincolo UNIQUE.Describes how to create a unique constraint. Creare vincoli univociCreate Unique Constraints
Viene descritto come modificare un vincolo UNIQUE.Describes how to modify a unique constraint. Modificare vincoli univociModify Unique Constraints
Viene descritto come eliminare un vincolo UNIQUE.Describes how to delete a unique constraint. Eliminazione di vincoli univociDelete Unique Constraints
Viene descritto come disabilitare un vincolo CHECK quando un agente di replica inserisce o aggiorna i dati nella tabella.Describes how to disable a check constraint when a replication agent inserts or updates data in your table. Disabilitare un vincolo CHECK per la replicaDisable Check Constraints for Replication
Viene descritto come disabilitare un vincolo CHECK quando vengono aggiunti, aggiornati o eliminati dati in una tabella.Describes how to disable a check constraint when data is added to, updated in, or deleted from a table. Disabilitazione di vincoli CHECK con le istruzioni INSERT e UPDATEDisable Check Constraints with INSERT and UPDATE Statements
Viene descritto come modificare l'espressione del vincolo o le opzioni che abilitano o disabilitano il vincolo se si verificano determinate condizioni.Describes how to change the constraint expression or the options that enable or disable the constraint for specific conditions. Modifica di vincoli CHECKModify Check Constraints
Viene descritto come eliminare un vincolo CHECK.Describes how to delete a check constraint. Eliminazione dei vincoli CHECKDelete Check Constraints
Viene descritto come visualizzare le proprietà di un vincolo CHECK.Describes how to view the properties of a check constraint. Vincoli UNIQUE e CHECKUnique Constraints and Check Constraints