ALTER TABLE table_constraint (Transact-SQL)ALTER TABLE table_constraint (Transact-SQL)

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

Specifica le proprietà di un vincolo PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK oppure di una definizione DEFAULT aggiunta a una tabella usando ALTER TABLE.Specifies the properties of a PRIMARY KEY, UNIQUE, FOREIGN KEY, a CHECK constraint, or a DEFAULT definition added to a table by using ALTER TABLE.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

[ CONSTRAINT constraint_name ]   
{   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        (column [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        [ WITH ( <index_option>[ , ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ... )  
          | filegroup | "default" } ]   
    | FOREIGN KEY   
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ NOT FOR REPLICATION ]   
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

ArgomentiArguments

CONSTRAINTCONSTRAINT
Specifica l'inizio di una definizione di un vincolo PRIMARY KEY, UNIQUE, FOREIGN KEY o CHECK oppure di una definizione DEFAULT.Specifies the start of a definition for a PRIMARY KEY, UNIQUE, FOREIGN KEY, or CHECK constraint, or a DEFAULT.

constraint_nameconstraint_name
Nome del vincolo.Is the name of the constraint. I nomi di vincolo devono essere conformi alle regole per gli identificatori, con l'eccezione che il nome non può iniziare con il simbolo di cancelletto (#).Constraint names must follow the rules for identifiers, except that the name cannot start with a number sign (#). Se constraint_name viene omesso, al vincolo viene assegnato un nome generato dal sistema.If constraint_name is not supplied, a system-generated name is assigned to the constraint.

PRIMARY KEYPRIMARY KEY
Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.Is a constraint that enforces entity integrity for a specified column or columns by using a unique index. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.Only one PRIMARY KEY constraint can be created for each table.

UNIQUEUNIQUE
Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.Is a constraint that provides entity integrity for a specified column or columns by using a unique index.

CLUSTERED | NONCLUSTEREDCLUSTERED | NONCLUSTERED
Imposta la creazione di un indice cluster o non cluster per il vincolo PRIMARY KEY o UNIQUE.Specifies that a clustered or nonclustered index is created for the PRIMARY KEY or UNIQUE constraint. Per impostazione predefinita per i vincoli PRIMARY KEY è impostata l'opzione CLUSTERED.PRIMARY KEY constraints default to CLUSTERED. Per impostazione predefinita per i vincoli UNIQUE è impostata l'opzione NONCLUSTERED.UNIQUE constraints default to NONCLUSTERED.

Se in una tabella esiste già un vincolo o un indice cluster, non è possibile specificare l'opzione CLUSTERED.If a clustered constraint or index already exists on a table, CLUSTERED cannot be specified. In questo caso, inoltre, i vincoli PRIMARY KEY sono impostati su NONCLUSTERED.If a clustered constraint or index already exists on a table, PRIMARY KEY constraints default to NONCLUSTERED.

Le colonne con tipo di dati ntext, text, varchar(max), nvarchar(max), varbinary(max), xml o imagenon possono essere specificate come colonne di un indice.Columns that are of the ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image data types cannot be specified as columns for an index.

columncolumn
Colonna o elenco di colonne tra parentesi utilizzate in un nuovo vincolo.Is a column or list of columns specified in parentheses that are used in a new constraint.

[ ASC | DESC ][ ASC | DESC ]
Specifica l'ordinamento della colonna o delle colonne che fanno parte dei vincoli di tabella.Specifies the order in which the column or columns participating in table constraints are sorted. Il valore predefinito è ASC.The default is ASC.

WITH FILLFACTOR =fillfactorWITH FILLFACTOR =fillfactor
Specifica la percentuale utilizzata da Motore di databaseDatabase Engine per riempire ogni pagina dell'indice utilizzata per archiviare dati dell'indice.Specifies how full the Motore di databaseDatabase Engine should make each index page used to store the index data. I valori per fillfactor specificati dall'utente possono essere compresi tra 1 e 100.User-specified fillfactor values can be from 1 through 100. Se non viene specificato alcun valore, il valore predefinito è 0.If a value is not specified, the default is 0.

Importante

WITH FILLFACTOR = fillfactor è documentata come unica opzione di indice per i vincoli PRIMARY KEY o UNIQUE solo per motivi di compatibilità con le versioni precedenti. Non sarà più documentata in questo senso nelle versioni future.Documenting WITH FILLFACTOR = fillfactor as the only index option that applies to PRIMARY KEY or UNIQUE constraints is maintained for backward compatibility, but will not be documented in this manner in future releases. È possibile specificare altre opzioni di indice nella clausola index_option di ALTER TABLE.Other index options can be specified in the index_option clause of ALTER TABLE.

ON { partition_scheme_name ***(** partition_column_name)* | filegroup| **" default " }ON { partition_scheme_name ***(** partition_column_name)* | filegroup| **" default " }
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Specifica il percorso di archiviazione dell'indice creato per il vincolo.Specifies the storage location of the index created for the constraint. Se si specifica partition_scheme_name, l'indice viene partizionato e viene eseguito il mapping delle partizioni ai filegroup specificati da partition_scheme_name.If partition_scheme_name is specified, the index is partitioned and the partitions are mapped to the filegroups that are specified by partition_scheme_name. Se si specifica filegroup l'indice viene creato nel filegroup specificato.If filegroup is specified, the index is created in the named filegroup. Se si specifica " default " o si omette ON, l'indice viene creato nello stesso filegroup della tabella.If " default " is specified or if ON is not specified at all, the index is created in the same filegroup as the table. Se si specifica ON quando si aggiunge un indice cluster per un vincolo PRIMARY KEY o UNIQUE, l'intera tabella viene spostata nel filegroup specificato durante la creazione dell'indice cluster.If ON is specified when a clustered index is added for a PRIMARY KEY or UNIQUE constraint, the whole table is moved to the specified filegroup when the clustered index is created.

In questo contesto, default non è una parola chiave bensì un identificatore del filegroup predefinito e deve essere delimitato, come in ON " default " o ON [ default ].In this context, default is not a keyword; it is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Se si specifica "" default ", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Si tratta dell'impostazione predefinita.This is the default setting.

FOREIGN KEY REFERENCESFOREIGN KEY REFERENCES
Vincolo che impone l'integrità referenziale per i dati nella colonna.Is a constraint that provides referential integrity for the data in the column. Per i vincoli FOREIGN KEY è necessario che ogni valore della colonna esista nella colonna specificata della tabella a cui viene fatto riferimento.FOREIGN KEY constraints require that each value in the column exist in the specified column in the referenced table.

referenced_table_namereferenced_table_name
Tabella a cui fa riferimento il vincolo FOREIGN KEY.Is the table referenced by the FOREIGN KEY constraint.

ref_columnref_column
Colonna o elenco di colonne tra parentesi a cui fa riferimento il nuovo vincolo FOREIGN KEY.Is a column or list of columns in parentheses referenced by the new FOREIGN KEY constraint.

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Specifica quale azione si verifica nelle righe della tabella che viene modificata se tali righe includono una relazione referenziale e se la riga a cui viene fatto riferimento viene eliminata dalla tabella padre.Specifies what action happens to rows in the table that is altered, if those rows have a referential relationship and the referenced row is deleted from the parent table. Il valore predefinito è NO ACTION.The default is NO ACTION.

NO ACTIONNO ACTION
Motore di database di SQL ServerSQL Server Database Engine genera un errore e viene eseguito il rollback dell'azione di eliminazione della riga nella tabella padre.The Motore di database di SQL ServerSQL Server Database Engine raises an error and the delete action on the row in the parent table is rolled back.

CASCADECASCADE
Le righe corrispondenti vengono eliminate dalla tabella di riferimento se la riga viene eliminata dalla tabella padre.Corresponding rows are deleted from the referencing table if that row is deleted from the parent table.

SET NULLSET NULL
Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene eliminata la riga corrispondente nella tabella padre.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is deleted. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
Tutti i valori che costituiscono la chiave esterna vengono impostati sui valori predefiniti quando viene eliminata la riga corrispondente nella tabella padre.All the values that comprise the foreign key are set to their default values when the corresponding row in the parent table is deleted. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti.For this constraint to execute, all foreign key columns must have default definitions. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.If a column is nullable and there is no explicit default value set, NULL becomes the implicit default value of the column.

Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici.Do not specify CASCADE if the table will be included in a merge publication that uses logical records. Per altre informazioni sui record logici, vedere Raggruppare modifiche alle righe correlate con record logici.For more information about logical records, see Group Changes to Related Rows with Logical Records.

Non è possibile definire ON DELETE CASCADE se esiste già un trigger INSTEAD OF per ON DELETE nella tabella che viene modificata.ON DELETE CASCADE cannot be defined if an INSTEAD OF trigger ON DELETE already exists on the table that is being altered.

Nel database AdventureWorks2012AdventureWorks2012, ad esempio, la tabella ProductVendor ha una relazione referenziale con la tabella Vendor.For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. La chiave esterna ProductVendor.VendorID fa riferimento alla chiave primaria Vendor.VendorID.The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

Se viene eseguita un'istruzione DELETE in una riga della tabella Vendor e viene specificata un'azione ON DELETE CASCADE per ProductVendor.VendorID, il Motore di databaseDatabase Engine verifica se esistono una o più righe dipendenti nella tabella ProductVendor.If a DELETE statement is executed on a row in the Vendor table and an ON DELETE CASCADE action is specified for ProductVendor.VendorID, the Motore di databaseDatabase Engine checks for one or more dependent rows in the ProductVendor table. In caso affermativo, le righe dipendenti della tabella ProductVendor vengono eliminate, oltre alla riga a cui viene fatto riferimento nella tabella Vendor.If any exist, the dependent rows in the ProductVendor table will be deleted, in addition to the row referenced in the Vendor table.

Al contrario, se viene specificato NO ACTION, il Motore di databaseDatabase Engine genera un errore ed esegue il rollback dell'azione di eliminazione per la riga della tabella Vendor quando esiste almeno una riga nella tabella ProductVendor che vi fa riferimento.Conversely, if NO ACTION is specified, the Motore di databaseDatabase Engine raises an error and rolls back the delete action on the Vendor row when there is at least one row in the ProductVendor table that references it.

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Specifica l'azione eseguita nelle righe della tabella modificata se tali righe includono una relazione referenziale e la riga a cui viene fatto riferimento è stata aggiornata nella tabella padre.Specifies what action happens to rows in the table altered when those rows have a referential relationship and the referenced row is updated in the parent table. Il valore predefinito è NO ACTION.The default is NO ACTION.

NO ACTIONNO ACTION
Motore di databaseDatabase Engine genera un errore e viene eseguito il rollback dell'azione di aggiornamento della riga nella tabella padre.The Motore di databaseDatabase Engine raises an error, and the update action on the row in the parent table is rolled back.

CASCADECASCADE
Le righe corrispondenti vengono aggiornate nella tabella di riferimento quando la riga viene aggiornata nella tabella padre.Corresponding rows are updated in the referencing table when that row is updated in the parent table.

SET NULLSET NULL
Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene aggiornata la riga corrispondente nella tabella padre.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
Tutti i valori che costituiscono la chiave esterna vengono impostati sui rispettivi valori predefiniti quando viene aggiornata la riga corrispondente nella tabella padre.All the values that make up the foreign key are set to their default values when the corresponding row in the parent table is updated. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti.For this constraint to execute, all foreign key columns must have default definitions. Se una colonna ammette valori Null e non viene impostato un valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.If a column is nullable, and there is no explicit default value set, NULL becomes the implicit default value of the column.

Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici.Do not specify CASCADE if the table will be included in a merge publication that uses logical records. Per altre informazioni sui record logici, vedere Raggruppare modifiche alle righe correlate con record logici.For more information about logical records, see Group Changes to Related Rows with Logical Records.

Non è possibile specificare ON UPDATE CASCADE, SET NULL o SET DEFAULT se nella tabella che viene modificata esiste già un trigger INSTEAD OF per ON UPDATE.ON UPDATE CASCADE, SET NULL, or SET DEFAULT cannot be defined if an INSTEAD OF trigger ON UPDATE already exists on the table that is being altered.

Nel database AdventureWorks2012AdventureWorks2012, ad esempio, la tabella ProductVendor ha una relazione referenziale con la tabella Vendor.For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. La chiave esterna ProductVendor.VendorID fa riferimento alla chiave primaria Vendor.VendorID.The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

Se viene eseguita un'istruzione UPDATE in una riga della tabella Vendor e viene specificata un'azione ON UPDATE CASCADE per ProductVendor.VendorID, il Motore di databaseDatabase Engine verifica se esistono una o più righe dipendenti nella tabella ProductVendor.If an UPDATE statement is executed on a row in the Vendor table and an ON UPDATE CASCADE action is specified for ProductVendor.VendorID, the Motore di databaseDatabase Engine checks for one or more dependent rows in the ProductVendor table. L'eventuale riga dipendente individuata nella tabella ProductVendor viene aggiornata insieme alla riga a cui viene fatto riferimento nella tabella Vendor.If any exist, the dependent row in the ProductVendor table will be updated, as well as the row referenced in the Vendor table.

Al contrario, se si specifica NO ACTION, nel Motore di databaseDatabase Engine viene generato un errore e viene eseguito il rollback dell'azione di aggiornamento per la riga Vendor quando esiste almeno una riga nella tabella ProductVendor che fa riferimento a essa.Conversely, if NO ACTION is specified, the Motore di databaseDatabase Engine raises an error and rolls back the update action on the Vendor row when there is at least one row in the ProductVendor table that references it.

NOT FOR REPLICATIONNOT FOR REPLICATION
Si applica a: SQL Server 2008SQL Server 2008 tramite SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Questa clausola può essere specificata per i vincoli FOREIGN KEY e CHECK.Can be specified for FOREIGN KEY constraints and CHECK constraints. Se per un vincolo si specifica questa clausola, il vincolo non viene imposto quando gli agenti di replica eseguono le operazioni di inserimento, aggiornamento o eliminazione.If this clause is specified for a constraint, the constraint is not enforced when replication agents perform insert, update, or delete operations.

DEFAULTDEFAULT
Specifica il valore predefinito per la colonna.Specifies the default value for the column. Le definizioni DEFAULT possono essere utilizzate per assegnare valori a una nuova colonna nelle righe di dati esistenti.DEFAULT definitions can be used to provide values for a new column in the existing rows of data. Non è possibile aggiungere definizioni DEFAULT a colonne che hanno un tipo di dati timestamp, una proprietà IDENTITY, una definizione DEFAULT esistente o un valore predefinito associato.DEFAULT definitions cannot be added to columns that have a timestamp data type, an IDENTITY property, an existing DEFAULT definition, or a bound default. Se alla colonna è associato un valore predefinito, è necessario rimuoverlo prima di aggiungere il nuovo valore predefinito.If the column has an existing default, the default must be dropped before the new default can be added. Se si specifica un valore predefinito per una colonna di tipo definito dall'utente, il tipo deve supportare la conversione implicita da constant_expression nel tipo definito dall'utente.If a default value is specified for a user-defined type column, the type should support an implicit conversion from constant_expression to the user-defined type. Per garantire la compatibilità con le versioni precedenti di SQL ServerSQL Server, è possibile assegnare un nome di vincolo a una definizione DEFAULT.To maintain compatibility with earlier versions of SQL ServerSQL Server, a constraint name can be assigned to a DEFAULT.

constant_expressionconstant_expression
Valore letterale, valore Null o funzione di sistema utilizzato come valore predefinito della colonna.Is a literal value, a NULL, or a system function that is used as the default column value. Se la funzione constant_expression viene usata insieme a una colonna definita come tipo definito dall'utente di MicrosoftMicrosoft .NET Framework.NET Framework, l'implementazione del tipo deve supportare una conversione implicita da constant_expression nel tipo definito dall'utente.If constant_expression is used in conjunction with a column defined to be of a MicrosoftMicrosoft .NET Framework.NET Framework user-defined type, the implementation of the type must support an implicit conversion from the constant_expression to the user-defined type.

FOR columnFOR column
Specifica la colonna associata a una definizione DEFAULT a livello di tabella.Specifies the column associated with a table-level DEFAULT definition.

WITH VALUESWITH VALUES
Specifica che il valore assegnato in DEFAULT constant_expression viene archiviato in una nuova colonna aggiunta alle righe esistenti.Specifies that the value given in DEFAULT constant_expression is stored in a new column that is added to existing rows. È possibile specificare la clausola WITH VALUES solo quando viene specificato DEFAULT in una clausola ADD di colonna.WITH VALUES can be specified only when DEFAULT is specified in an ADD column clause. Se la colonna aggiunta ammette valori Null e viene specificata la clausola WITH VALUES, il valore predefinito viene archiviato nella nuova colonna aggiunta alle righe esistenti.If the added column allows null values and WITH VALUES is specified, the default value is stored in the new column that is added to existing rows. Se per le colonne che ammettono valori Null la clausola WITH VALUES non viene specificata, il valore NULL viene archiviato nella nuova colonna nelle righe esistenti.If WITH VALUES is not specified for columns that allow nulls, NULL is stored in the new column in existing rows. Se la nuova colonna non ammette valori Null, il valore predefinito viene archiviato nelle nuove righe, indipendentemente dal fatto che la clausola WITH VALUES sia o meno specificata.If the new column does not allow nulls, the default value is stored in new rows regardless of whether WITH VALUES is specified.

CHECKCHECK
Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una o più colonne.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
Espressione logica utilizzata in un vincolo CHECK che restituisce TRUE o FALSE.Is a logical expression used in a CHECK constraint and returns TRUE or FALSE. Se usata con vincoli CHECK, logical_expression non può fare riferimento a un'altra tabella ma può fare riferimento ad altre colonne nella stessa tabella per la stessa riga.logical_expression used with CHECK constraints cannot reference another table but can reference other columns in the same table for the same row. L'espressione non può fare riferimento a un tipo di dati alias.The expression cannot reference an alias data type.

RemarksRemarks

Quando si aggiungono vincoli FOREIGN KEY o CHECK, in tutti i dati esistenti viene verificata la presenza di eventuali violazioni dei vincoli, a meno che non venga specificata l'opzione WITH NOCHECK.When FOREIGN KEY or CHECK constraints are added, all existing data is verified for constraint violations unless the WITH NOCHECK option is specified. Se si verificano violazioni, l'istruzione ALTER TABLE ha esito negativo e viene restituito un errore.If any violations occur, ALTER TABLE fails and an error is returned. Quando si aggiunge un nuovo vincolo PRIMARY KEY o UNIQUE a colonne esistenti, i dati delle colonne devono essere univoci.When a new PRIMARY KEY or UNIQUE constraint is added to an existing column, the data in the column or columns must be unique. Se vengono individuati valori duplicati, l'istruzione ALTER TABLE ha esito negativo.If duplicate values are found, ALTER TABLE fails. L'opzione WITH NOCHECK non ha alcun effetto quando si aggiungono vincoli PRIMARY KEY o UNIQUE.The WITH NOCHECK option has no effect when PRIMARY KEY or UNIQUE constraints are added.

Ogni vincolo PRIMARY KEY e UNIQUE genera un indice.Each PRIMARY KEY and UNIQUE constraint generates an index. Il numero di vincoli UNIQUE e PRIMARY KEY non deve generare un numero di indici della tabella maggiore di 999 nel caso di indici non cluster e maggiore di 1 nel caso di indici cluster.The number of UNIQUE and PRIMARY KEY constraints cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index. I vincoli di chiave esterna non generano automaticamente un indice.Foreign key constraints do not automatically generate an index. Le colonne chiave esterna, tuttavia, vengono in genere utilizzate in criteri di join nelle query confrontando le colonne nel vincolo di chiave esterna di una tabella con le colonne chiave primaria o univoca nell'altra tabella.However, foreign key columns are frequently used in join criteria in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. Un indice nelle colonne chiave esterna consente a Motore di databaseDatabase Engine di trovare rapidamente i dati correlati nella tabella della chiave esterna.An index on the foreign key columns enables the Motore di databaseDatabase Engine to quickly find related data in the foreign key table.

EsempiExamples

Per esempi, vedere ALTER TABLE (Transact-SQL).For examples, see ALTER TABLE (Transact-SQL).

Vedere ancheSee Also

ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL)