Condividi tramite


ALTER TABLE table_constraint (Transact-SQL)

Applies to:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di AzureWarehouse in Microsoft FabricSQL nel database Microsoft Fabric

Usare ALTER TABLE per specificare le proprietà di un PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK vincolo o DEFAULT definizione aggiunta a una tabella usando ALTER TABLE (Transact-SQL).

convenzioni di sintassi Transact-SQL

Syntax

[ 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 ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

Arguments

CONSTRAINT

Specifica l'inizio di una definizione per un PRIMARY KEYvincolo , UNIQUE, FOREIGN KEYo CHECK o .DEFAULT

nome_vincolo

Nome del vincolo. I nomi dei vincoli devono seguire le regole per gli identificatori, ad eccezione del fatto che il nome non può iniziare con un segno di numero (#). Se non si specifica constraint_name, il sistema assegna un nome generato al vincolo.

CHIAVE PRIMARIA

Vincolo che applica l'integrità dell'entità per una colonna o una colonna specificata utilizzando un indice univoco. È possibile creare un PRIMARY KEY solo vincolo per ogni tabella.

UNIQUE

Vincolo che fornisce l'integrità dell'entità per una colonna o colonne specificata utilizzando un indice univoco.

CLUSTERED | NON CLUSTER

Specifica che viene creato un indice cluster o non cluster per il PRIMARY KEY vincolo o UNIQUE . PRIMARY KEY per impostazione predefinita, i vincoli sono CLUSTERED. UNIQUE per impostazione predefinita, i vincoli sono NONCLUSTERED.

Se esiste già un vincolo cluster o un indice in una tabella, non è possibile specificare CLUSTERED. Se esiste già un vincolo o un indice cluster in una tabella, PRIMARY KEY per impostazione predefinita i vincoli sono NONCLUSTERED.

Non è possibile specificare colonne di tipo ntext, text, varchar(max), nvarchar(max), varbinary(max), xml o image come colonne per un indice.

column

Colonna o elenco di colonne specificate tra parentesi usate in un nuovo vincolo.

[ ASC | DESC ]

Specifica l'ordinamento della colonna o delle colonne che fanno parte dei vincoli di tabella. Il valore predefinito è l'ordinamento crescente (ASC).

CON FILLFACTOR = fillfactor

Specifica il modo in cui il motore di database deve rendere ogni pagina di indice usata per archiviare i dati dell'indice. I valori per fillfactor specificati dall'utente possono essere compresi tra 1 e 100. Se non si specifica un valore, il valore predefinito è 0.

Per la compatibilità con le versioni precedenti, questa documentazione include WITH FILLFACTOR = <fillfactor> come unica opzione di indice applicabile a PRIMARY KEY o UNIQUE vincoli. Questa sintassi non verrà documentata nelle versioni future. È possibile specificare altre opzioni di indice nella clausola index_option di ALTER TABLE.

ON { partition_scheme_name(partition_column_name) | filegroup | "default" }

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 le partizioni vengono mappate ai filegroup specificati partition_scheme_name . Se si specifica il filegroup, l'indice viene creato nel filegroup denominato. Se si specifica "default" o se non si specifica ON affatto, l'indice viene creato nello stesso filegroup della tabella. Se si specifica ON quando si aggiunge un indice cluster per un PRIMARY KEY vincolo o UNIQUE , l'intera tabella viene spostata nel filegroup specificato quando viene creato l'indice cluster.

In questo contesto, il valore predefinito non è una parola chiave; è un identificatore per il filegroup predefinito e deve essere delimitato, come in ON"default" o ON[default]. Se si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere ON per la sessione corrente. Si tratta dell'impostazione predefinita.

RIFERIMENTI A CHIAVI ESTERNE

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

referenced_table_name

Tabella a cui fa riferimento il FOREIGN KEY vincolo .

ref_column

Colonna o elenco di colonne tra parentesi a cui fa riferimento il nuovo FOREIGN KEY vincolo.

ON DELETE { NESSUNA AZIONE | CASCADE | SET NULL | IMPOSTA PREDEFINITO }

Specifica l'azione eseguita sulle righe nella tabella modificata, se tali righe hanno una relazione referenziale ed eliminare la riga a cui si fa riferimento dalla tabella padre. Il valore predefinito è NO ACTION.

NESSUNA AZIONE

Il Motore di database di SQL Server genera un errore ed esegue il rollback dell'azione di eliminazione nella riga della tabella padre.

CASCADE

Elimina le righe corrispondenti dalla tabella di riferimento se si elimina tale riga dalla tabella padre.

SET NULL

Imposta tutti i valori che costituiscono la chiave esterna su NULL quando si elimina la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

IMPOSTARE PREDEFINITI

Imposta tutti i valori che costituiscono la chiave esterna sui relativi valori predefiniti quando si elimina 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 è 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 definire ON DELETE CASCADE se esiste già un INSTEAD OF trigger ON DELETE nella tabella che si sta modificando.

Nel database, ad esempio, AdventureWorks2025 la ProductVendor tabella ha una relazione referenziale con la Vendor tabella . La ProductVendor.VendorID chiave esterna fa riferimento alla Vendor.VendorID chiave primaria.

Se si esegue un'istruzione /> e si specifica un'azione per , il motore di database verifica la presenza di una o più righe dipendenti nella tabella . Se presente, le righe dipendenti nella ProductVendor tabella vengono 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 ed esegue il rollback dell'azione di eliminazione nella riga Vendor quando è presente almeno una riga nella tabella ProductVendor che vi fa riferimento.

ON UPDATE { NESSUNA AZIONE | CASCADE | SET NULL | IMPOSTA PREDEFINITO }

Specifica l'azione che accade alle righe nella tabella modificata quando tali righe hanno una relazione referenziale e si aggiorna la riga a cui si fa riferimento nella tabella padre. Il valore predefinito è NO ACTION.

NESSUNA AZIONE

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

CASCADE

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

SET NULL

Imposta tutti i valori che costituiscono la chiave esterna su NULL quando si aggiorna la riga corrispondente nella tabella padre. Per l'esecuzione di questo vincolo, è necessario che le colonne chiave esterna ammettano valori Null.

IMPOSTARE PREDEFINITI

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 è 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 UPDATE CASCADE, SET NULLo SET DEFAULT non può essere definito se esiste già un INSTEAD OF trigger ON UPDATE nella tabella da modificare.

Nel database, ad esempio, AdventureWorks2025 la ProductVendor tabella ha una relazione referenziale con la Vendor tabella . La ProductVendor.VendorID chiave esterna fa riferimento alla Vendor.VendorID chiave primaria.

Se si esegue un'istruzione UPDATE in una riga nella tabella Vendor e si specifica un'azione ON UPDATE CASCADE per ProductVendor.VendorID, il motore di database verifica la presenza di una o più righe dipendenti nella tabella ProductVendor. Se presente, la riga dipendente nella ProductVendor tabella viene aggiornata, nonché la 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 riga Vendor quando è presente almeno una riga nella tabella ProductVendor che vi fa riferimento.

NON PER REPLICAZIONE

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

Se si specifica questa clausola per un vincolo, gli agenti di replica non applicano il vincolo quando eseguono operazioni di scrittura. È possibile specificare questa clausola per FOREIGN KEY vincoli e CHECK vincoli.

CONNECTION

Specifica la coppia di tabelle dei nodi a cui è consentito connettersi il vincolo di arco specificato. ON DELETE specifica cosa accade alle righe nella tabella perimetrale quando vengono eliminati i nodi che si connettono al perimetro.

DEFAULT

Specifica il valore predefinito per la colonna. Usare DEFAULT le definizioni per fornire valori per una nuova colonna nelle righe di dati esistenti. Non è possibile aggiungere DEFAULT definizioni alle colonne con un tipo di dati timestamp , una IDENTITY proprietà, una definizione esistente DEFAULT o un valore predefinito associato. Se la colonna ha un valore predefinito esistente, è necessario eliminare il valore predefinito prima di poter aggiungere un nuovo valore predefinito. Se si specifica un valore predefinito per una colonna di tipo definito dall'utente, il tipo deve supportare una conversione implicita da constant_expression al tipo definito dall'utente. Per mantenere la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a un DEFAULT.

constant_expression

Valore letterale, un NULLoggetto o una funzione di sistema usata come valore di colonna predefinito. Se si usa constant_expression insieme a una colonna definita come tipo definito dall'utente di Microsoft .NET Framework, l'implementazione del tipo deve supportare una conversione implicita dal constant_expression al tipo definito dall'utente.

FOR colonna

Specifica la colonna associata a una definizione a livello DEFAULT di tabella.

CON VALORI

  • Quando si aggiunge una colonna e un DEFAULT vincolo, se la colonna consente valori Null, utilizzando WITH VALUES imposta il valore della nuova colonna per le righe esistenti sul valore specificato in DEFAULTconstant_expression.

  • Se la colonna che si aggiunge non consente valori Null, il valore della colonna per le righe esistenti viene sempre impostato sul valore specificato nell'espressione DEFAULTcostante.

In SQL Server 2012 e versioni successive, questa operazione può essere un'operazione di metadati adding-not-null-columns-as-an-online-operation.

Se si usa WITH VALUES quando la colonna correlata non viene aggiunta, non ha alcun effetto.

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 CHECK vincolo che restituisce TRUE o FALSE. logical_expression usati con CHECK vincoli non possono fare riferimento a un'altra tabella, ma possono 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 si aggiungono FOREIGN KEY vincoli o CHECK , il sistema controlla tutti i dati esistenti per verificare la presenza di violazioni dei vincoli, a meno che non si specifichi l'opzione WITH NOCHECK . Se si verificano violazioni, ALTER TABLE non riesce e restituisce un errore. Quando si aggiunge un vincolo o UNIQUE nuovo PRIMARY KEY a una colonna esistente, i dati nella colonna o nelle colonne devono essere univoci. Se vengono trovati valori duplicati, ALTER TABLE ha esito negativo. L'opzione WITH NOCHECK non ha alcun effetto quando si aggiungono PRIMARY KEY vincoli o UNIQUE .

Ogni PRIMARY KEY vincolo e UNIQUE genera un indice. Il numero di UNIQUE vincoli e PRIMARY KEY non può causare il numero di indici nella tabella superiore a 999 indici non cluster e 1 indice cluster. I vincoli di chiave esterna non generano automaticamente un indice. Tuttavia, spesso si usano colonne chiave esterna nei criteri di join nelle query associando la colonna o le colonne nel vincolo di chiave esterna di una tabella con la colonna chiave primaria o univoca o colonne nell'altra tabella. Un indice nelle colonne di chiave esterna consente al motore di database di trovare rapidamente i dati correlati nella tabella delle chiavi esterne.

In SQL Server 2022 (16.x) e versioni successive le operazioni ripristinabili supportano l'aggiunta di vincoli di tabella per i vincoli di chiave primaria e di chiave univoca. Per altre informazioni sull'abilitazione e sull'uso di operazioni ALTER TABLE ADD CONSTRAINT ripristinabili, vedere Aggiungere vincoli di tabella ripristinabili.

Warehouse in Microsoft Fabric supporta ADD o DROPPRIMARY KEY, UNIQUE e FOREIGN_KEY vincoli di colonna, ma solo se si specifica l'opzione NOT ENFORCED. Il warehouse in Microsoft Fabric blocca tutte le altre operazioni ALTER TABLE.

Examples

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