Condividi tramite


ALTER TABLE column_constraint (Transact-SQL)

Si applica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL Database in Anteprima di Microsoft Fabric

Specifica le proprietà di un vincolo PRIMARY KEY, FOREIGN KEY, UNIQUE o CHECK incluso nella definizione di una nuova colonna aggiunta a una tabella tramite ALTER TABLE.

Convenzioni relative alla sintassi Transact-SQL

Syntax

Sintassi per SQL Server, database SQL di Azure, Istanza gestita di SQL di Azure, database SQL nell'anteprima di Microsoft Fabric

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

Sintassi per Microsoft Fabric Warehouse

[ CONSTRAINT constraint_name ]  
{  
    { PRIMARY KEY | UNIQUE }  
       NONCLUSTERED    
        (column [ ASC | DESC ] [ ,...n ] )  
NOT ENFORCED
    | FOREIGN KEY  
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]  
NOT ENFORCED
}  

Arguments

CONSTRAINT

Specifica l'inizio della definizione di un vincolo PRIMARY KEY, UNIQUE, FOREIGN KEY o CHECK.

constraint_name
Nome del vincolo. 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 (#). Se constraint_name viene omesso, al vincolo viene assegnato un nome generato dal sistema.

NULL | NOT NULL

Specifica se la colonna può accettare NULL valori. Le colonne che non consentono valori NULL possono essere aggiunte solo se sono specificate per impostazione predefinita. Se la nuova colonna consente NULL valori e non viene specificato alcun valore predefinito, la nuova colonna contiene NULL per ogni riga della tabella. Se la nuova colonna consente NULL valori e viene aggiunta una definizione predefinita con la nuova colonna, è possibile usare l'opzione WITH VALUES per archiviare il valore predefinito nella nuova colonna per ogni riga esistente nella tabella.

Se la nuova colonna non consente NULL valori, è necessario aggiungere una definizione DEFAULT con la nuova colonna. La nuova colonna viene caricata automaticamente con il valore predefinito in ogni riga esistente delle nuove colonne.

Quando l'aggiunta di una colonna richiede la modifica fisica delle righe di dati di una tabella, ad esempio l'aggiunta di valori DEFAULT a ogni riga, durante l'esecuzione dell'istruzione ALTER TABLE vengono mantenuti attivi i blocchi sulla tabella. Ciò ha ripercussioni sulla possibilità di modificare il contenuto della tabella mentre i blocchi sono attivi. Al contrario, l'aggiunta di una colonna che consente NULL valori e non specifica un valore predefinito è solo un'operazione di metadati e non comporta blocchi.

Quando si usano CREATE TABLE o ALTER TABLE, le impostazioni del database e della sessione influiscono ed eventualmente eseguono l'override del valore Null del tipo di dati usato in una definizione di colonna. È consigliabile definire sempre in modo esplicito le colonne non calcolate come NULL o NOT NULL oppure, se si usa un tipo di dati definito dall'utente, che consente alla colonna di usare il valore Nullbility predefinito del tipo di dati. Per altre informazioni, vedere CREATE TABLE.

PRIMARY KEY

Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco. È possibile creare un solo vincolo PRIMARY KEY per ogni tabella.

UNIQUE

Vincolo che impone l'integrità di entità per una o più colonne specificate tramite un indice univoco.

CLUSTERED | NON CLUSTER

Imposta la creazione di un indice cluster o non cluster per il vincolo PRIMARY KEY o UNIQUE. Per impostazione predefinita per i vincoli PRIMARY KEY è impostata l'opzione CLUSTERED. Per impostazione predefinita per i vincoli UNIQUE è impostata l'opzione NONCLUSTERED.

Se in una tabella esiste già un vincolo o un indice cluster, non è possibile specificare l'opzione CLUSTERED. In questo caso, inoltre, i vincoli PRIMARY KEY sono impostati su 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.

In Microsoft Fabric Warehouse, NONCLUSTERED non ha alcun effetto.

WITH FILLFACTOR =fillfactor

Specifica la percentuale utilizzata dal motore di database per riempire ogni pagina dell'indice usata per archiviare dati dell'indice. I valori per il fattore di riempimento specificati dall'utente possono essere compresi tra 1 e 100. Se non viene specificato alcun valore, il valore predefinito è 0.

Important

La documentazione WITH FILLFACTOR come unica opzione di indice applicabile ai vincoli PRIMARY KEY o UNIQUE viene mantenuta per la compatibilità con le versioni precedenti, ma non verrà documentata in questo modo nelle versioni future. È possibile specificare altre opzioni di indice nella clausola index_option di ALTER TABLE.

ON { partition_scheme_name(partition_column_name | default }

Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

Specifica il percorso di archiviazione dell'indice creato per il vincolo. Se si specifica partition_scheme_name, l'indice viene partizionato e viene eseguito il mapping delle partizioni ai filegroup specificati da partition_scheme_name. Se si specifica filegroup l'indice viene creato nel filegroup specificato. Se si specifica "default" o si omette ON, l'indice viene creato nello stesso filegroup della tabella. 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.

In questo contesto, default non è una parola chiave. Si tratta di un identificatore del filegroup predefinito e deve essere delimitato, ad esempio ON default o ON [default]. Se QUOTED_IDENTIFIER per la sessione corrente. Si tratta dell'impostazione predefinita. Per altre informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

NOT ENFORCED

In Microsoft Fabric Warehouse, la chiave primaria, la chiave univoca e i vincoli di chiave esterna richiedono NOT ENFORCED. L'integrità dei vincoli deve essere mantenuta dall'applicazione.

RIFERIMENTI A CHIAVI ESTERNE

Vincolo che impone l'integrità referenziale per i dati nella colonna. I vincoli FOREIGN KEY richiedono che ogni valore nella colonna esista nella colonna specificata nella tabella a cui si fa riferimento.

schema_name
Nome dello schema a cui appartiene la tabella a cui il vincolo FOREIGN KEY fa riferimento.

referenced_table_name
Tabella a cui fa riferimento il vincolo FOREIGN KEY.

ref_column
Colonna tra parentesi a cui il nuovo vincolo FOREIGN KEY fa riferimento.

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. Il valore predefinito è NO ACTION.

NO ACTION
Il motore di database di SQL Server genera un errore e viene eseguito il rollback dell'azione di eliminazione della riga nella tabella padre.

CASCADE
Le righe corrispondenti vengono eliminate dalla tabella di riferimento se la riga viene eliminata dalla tabella padre.

SET NULL
Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

SET DEFAULT
Tutti i valori che costituiscono la chiave esterna vengono impostati sui valori predefiniti quando viene eliminata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti. Se una colonna è nullable e non è impostato alcun valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici. Per altre informazioni sui record logici, vedere Raggruppare modifiche alle righe correlate con record logici.

ON DELETE CASCADE non può essere definito se esiste già un INSTEAD OF trigger ON DELETE nella tabella da modificare.

Nel database, ad esempio, AdventureWorks2022 la ProductVendor tabella ha una relazione referenziale con la Vendor tabella . Il ProductVendor. VendorID la chiave esterna fa riferimento a Vendor. VendorID chiave primaria.

Se viene eseguita un'istruzione DELETE in una riga della Vendor tabella e viene specificata un'azione ON DELETE CASCADE per ProductVendor.VendorID, il motore di database verifica la presenza di una o più righe dipendenti nella ProductVendor tabella. Se presente, le righe dipendenti nella ProductVendor tabella verranno eliminate, oltre alla riga a cui si fa riferimento nella Vendor tabella.

Viceversa, se si specifica NO ACTION, il motore di database genera un errore e esegue il rollback dell'azione di eliminazione nella Vendor riga quando è presente almeno una riga nella ProductVendor tabella che vi fa riferimento.

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. Il valore predefinito è NO ACTION.

NO ACTION
Il motore di database genera un errore e viene eseguito il rollback dell'azione di aggiornamento della riga nella tabella padre.

CASCADE
Le righe corrispondenti vengono aggiornate nella tabella di riferimento quando la riga viene aggiornata nella tabella padre.

SET NULL
Tutti i valori che costituiscono la chiave esterna vengono impostati su NULL quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

SET DEFAULT
Tutti i valori che costituiscono la chiave esterna vengono impostati sui rispettivi valori predefiniti quando viene aggiornata la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che per tutte le colonne chiave esterna siano definiti valori predefiniti. Se una colonna è nullable e non è impostato alcun valore predefinito esplicito, NULL diventa il valore predefinito implicito della colonna.

Non specificare CASCADE se la tabella verrà inclusa in una pubblicazione di tipo merge che utilizza record logici. Per altre informazioni sui record logici, vedere Raggruppare modifiche alle righe correlate con record logici.

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.

Nel database, ad esempio, AdventureWorks2022 la ProductVendor tabella ha una relazione referenziale con la Vendor tabella . Il ProductVendor. VendorID la chiave esterna fa riferimento a Vendor. VendorID chiave primaria.

Se viene eseguita un'istruzione UPDATE in una riga della Vendor tabella e viene specificata un'azione ON UPDATE CASCADE per ProductVendor.VendorID, il motore di database verifica la presenza di una o più righe dipendenti nella ProductVendor tabella. Se presente, la riga dipendente nella ProductVendor tabella verrà aggiornata, oltre alla riga a cui si fa riferimento nella Vendor tabella.

Viceversa, se si specifica NO ACTION, il motore di database genera un errore e esegue il rollback dell'azione di aggiornamento nella Vendor riga quando è presente almeno una riga nella ProductVendor tabella che vi fa riferimento.

NOT FOR REPLICATION
Si applica a: SQL Server 2008 (10.0.x) e versioni successive.

Questa clausola può essere specificata per i vincoli FOREIGN KEY e CHECK. 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.

CHECK

Vincolo che impone l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una o più colonne.

logical_expression
Espressione logica utilizzata in un vincolo CHECK che restituisce TRUE o 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. L'espressione non può fare riferimento a un tipo di dati alias.

Remarks

Quando vengono aggiunti vincoli FOREIGN KEY o CHECK, tutti i dati esistenti vengono verificati per le violazioni dei vincoli, a meno che non venga specificata l'opzione WITH NOCHECK . Se si verificano violazioni, l'istruzione ALTER TABLE ha esito negativo e viene restituito un errore. Quando si aggiunge un nuovo vincolo PRIMARY KEY o UNIQUE a colonne esistenti, i dati delle colonne devono essere univoci. Se vengono individuati valori duplicati, l'istruzione ALTER TABLE ha esito negativo. L'opzione WITH NOCHECK non ha alcun effetto quando vengono aggiunti vincoli PRIMARY KEY o UNIQUE.

Ogni vincolo PRIMARY KEY e UNIQUE genera un indice. 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. I vincoli di chiave esterna non generano automaticamente un indice. Tuttavia, le colonne di chiave esterna vengono usate frequentemente nei criteri di join di query, associando il vincolo di chiave esterna di una tabella con la colonna o le colonne chiave primaria o univoca nell'altra tabella. Un indice nelle colonne chiave esterna consente al motore di database di trovare rapidamente i dati correlati nella tabella chiave esterna.

Examples

Per gli esempi, vedere ALTER TABLE (Transact-SQL).