Share via


column_constraint (Transact-SQL)

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.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

[ 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 )
}

Argomenti

  • 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 la sola 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 supporta o meno valori Null. È possibile aggiungere le colonne che non ammettono valori Null solo se a esse è associato un valore predefinito. Le nuove colonne che ammettono valori Null, ma a cui non è associato alcun valore predefinito contengono NULL per ogni riga della tabella. Se insieme a una nuova colonna che ammette valori Null viene aggiunta una definizione DEFAULT, è possibile specificare l'opzione WITH VALUES per la memorizzazione del valore predefinito nella nuova colonna per ogni riga della tabella.

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

    Nota di attenzioneAttenzione

    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. L'aggiunta di una colonna che ammette valori Null ma che non specifica un valore predefinito è solo un'operazione a livello di metadati che non richiede alcun blocco.

    In caso di utilizzo dell'istruzione CREATE TABLE o ALTER TABLE, le impostazioni del database e della sessione influenzano e talvolta sostituiscono il supporto di valori Null del tipo di dati utilizzato in una definizione di colonna. È consigliabile definire sempre in modo esplicito una colonna come NULL o NOT NULL per le colonne non calcolate oppure, se si utilizza un tipo di dati definito dall'utente, consentire nella colonna l'utilizzo dell'impostazione predefinita relativa al supporto di valori Null per tale tipo di dati. Per ulteriori informazioni, vedere CREATE TABLE (Transact-SQL).

  • 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 | NONCLUSTERED
    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.

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

  • WITH FILLFACTOR **=**fillfactor
    Specifica la percentuale utilizzata da MicrosoftMotore di database per riempire ogni pagina dell'indice utilizzata per archiviare dati. 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.

    Nota importanteImportante

    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. È possibile specificare altre opzioni di indice nella clausola index_option di ALTER TABLE.

  • ON { partition_scheme_name**(partition_column_name)** | filegroup | "default" }
    Specifica la posizione 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 da partition_scheme_name. Se si specifica filegroup, l'indice viene creato nel filegroup specificato. Se si specifica "default" o se si omette ON, l'indice viene creato nello stesso filegroup della tabella. Se invece ON viene specificato 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 si specifica "default", l'opzione QUOTED_IDENTIFIER deve essere impostata su ON per la sessione corrente. Questa è l'impostazione predefinita. Per ulteriori informazioni, vedere SET QUOTED_IDENTIFIER (Transact-SQL).

  • FOREIGN KEY REFERENCES
    Vincolo che impone l'integrità referenziale per i dati nella colonna. Per i vincoli FOREIGN KEY è necessario che ogni valore della colonna esista nella colonna specificata della tabella a cui viene fatto 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 di chiavi esterne 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 di chiavi esterne siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un 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 ulteriori informazioni sui record logici, vedere Raggruppamento di modifiche alla righe correlate con record logici.

    Non è possibile specificare ON DELETE CASCADE se nella tabella in fase di modifica esiste già un trigger INSTEAD OF ON DELETE.

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

    Se in una riga della tabella Vendor viene eseguita un'istruzione DELETE e per ProductVendor.VendorID si specifica ON DELETE CASCADE, il Motore di database verifica l'esistenza di una o più righe dipendenti nella tabella ProductVendor. In caso affermativo, le righe dipendenti della tabella ProductVendor vengono eliminate, oltre alla riga a cui viene fatto riferimento nella tabella Vendor.

    Se invece si specifica NO ACTION, il Motore di database genera un errore e viene eseguito il rollback dell'azione di eliminazione nella riga Vendor se esiste almeno una riga nella tabella ProductVendor che fa riferimento a essa.

  • 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 di chiavi esterne 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 di chiavi esterne siano definiti valori predefiniti. Se una colonna ammette valori Null e non viene impostato un 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 ulteriori informazioni sui record logici, vedere Raggruppamento di modifiche alla righe correlate con record logici.

    Non è possibile specificare ON UPDATE CASCADE se nella tabella esiste già un trigger INSTEAD OF ON UPDATE.

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

    Se viene eseguita un'istruzione UPDATE per una riga della tabella Vendor e viene specificata un'azione ON UPDATE CASCADE per ProductVendor.VendorID, Motore di database verifica se esistono una o più righe dipendenti nella tabella ProductVendor. Se la verifica ha esito positivo, la riga dipendente nella tabella ProductVendor verrà aggiornata assieme alla riga a cui viene fatto riferimento nella tabella Vendor.

    Se invece si specifica NO ACTION, il Motore di database genera un errore e viene eseguito il rollback dell'azione di aggiornamento nella riga Vendor se esiste almeno una riga nella tabella ProductVendor che fa riferimento a essa.

  • NOT FOR REPLICATION
    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. Per ulteriori informazioni, vedere Controllo di vincoli, identità e trigger con l'opzione NOT FOR REPLICATION.

  • 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. Restituisce TRUE o FALSE. Se logical_expression viene utilizzato con vincoli CHECK non può fare riferimento a un'altra tabella, ma può fare riferimento ad altre colonne della stessa tabella per la stessa riga. L'espressione non può fare riferimento a un tipo di dati alias.

Osservazioni

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.

Esempi

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