Vincoli

I vincoli consentono di definire il modo in cui il Motore di database applica automaticamente l'integrità di un database. I vincoli definiscono le regole relative ai valori consentiti nelle colonne e rappresentano il meccanismo standard per applicare l'integrità. L'utilizzo dei vincoli è preferibile rispetto ai Trigger DML, alle regole e ai valori predefiniti. Le definizioni dei vincoli vengono utilizzate inoltre da Query Optimizer per generare piani di esecuzione delle query a prestazioni elevate.

Classi di vincoli

SQL Server supporta le classi di vincoli seguenti:

  • NOT NULL specifica che la colonna non accetta valori NULL. Per ulteriori informazioni, vedere Supporto dei valori Null.

  • I vincoli CHECK applicano l'integrità di dominio tramite la limitazione dei valori che è possibile inserire in una colonna. Per ulteriori informazioni, vedere Vincoli CHECK.

    Un vincolo CHECK specifica una condizione di ricerca booleana (restituisce TRUE, FALSE o UNKNOWN) che viene applicata a tutti i valori immessi per la colonna. Tutti i valori che restituiscono il valore FALSE vengono rifiutati. È possibile specificare più vincoli CHECK per ogni colonna. Nell'esempio seguente viene illustrata la creazione del vincolo chk_id. Questo vincolo applica inoltre il dominio della chiave primaria assicurando che per la chiave vengano immessi solo numeri compresi in un intervallo specificato.

    CREATE TABLE cust_sample
       (
       cust_id            int      PRIMARY KEY,
       cust_name         char(50),
       cust_address         char(50),
       cust_credit_limit   money,
       CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
       )
    
  • I vincoli UNIQUE applicano l'univocità dei valori in un set di colonne.

    In un vincolo UNIQUE non è consentito che due righe della stessa tabella contengano gli stessi valori per le colonne. Le chiavi primarie impongono anche l'univocità, ma non consentono il valore univoco NULL. Per ulteriori informazioni, vedere Vincoli UNIQUE.

  • I vincoli PRIMARY KEY identificano la colonna o il set di colonne contenente valori che identificano in modo univoco una riga in una tabella. Per ulteriori informazioni, vedere Vincoli PRIMARY KEY.

    Non è consentito che due righe della stessa tabella contengano lo stesso valore di chiave primaria. Non è possibile immettere un valore NULL per una colonna chiave primaria. È consigliabile utilizzare come chiave primaria una colonna integer di dimensioni ridotte. Ogni tabella dovrebbe includere una chiave primaria. Una colonna o una combinazione di colonne qualificata come valore di chiave primaria viene definita chiave candidata.

    Nell'esempio seguente viene creata la tabella part_sample e il campo part_nmbr viene specificato come chiave primaria.

    CREATE TABLE part_sample
             (part_nmbr      int         PRIMARY KEY,
             part_name      char(30),
             part_weight      decimal(6,2),
             part_color      char(15) );
    
  • I vincoli FOREIGN KEY identificano e applicano le relazioni tra le tabelle. Per ulteriori informazioni, vedere Vincoli FOREIGN KEY.

    Una chiave esterna in una tabella punta a una chiave candidata di un'altra tabella. Nell'esempio seguente, la tabella order_part stabilisce una chiave esterna che fa riferimento alla tabella part_sample definita in precedenza.

    CREATE TABLE order_part
          (order_nmbr      int,
          part_nmbr      int
             FOREIGN KEY REFERENCES part_sample(part_nmbr)
                ON DELETE NO ACTION,
          qty_ordered      int);
    GO
    

    Non è possibile inserire una riga con un valore di chiave esterna (ad eccezione di NULL) se non è presente una chiave candidata con tale valore. La clausola ON DELETE controlla le azioni che vengono eseguite se si tenta di eliminare una riga alla quale puntano chiavi esterne esistenti. La clausola ON DELETE dispone di due opzioni:

    • NO ACTION specifica che l'eliminazione non viene eseguita e genera un errore.

    • CASCADE specifica che vengono eliminate anche tutte le righe con chiavi esterne che puntano alla riga eliminata.

    • SET NULL specifica che tutte le righe con chiavi esterne che puntano alla riga eliminata vengono impostate su NULL.

    • SET DEFAULT specifica che tutte le righe con chiavi esterne che puntano alla riga eliminata vengono impostate sul valore predefinito. Per ulteriori informazioni, vedere Valori predefiniti.

    La clausola ON UPDATE definisce le azioni che vengono eseguite se si tenta di aggiornare un valore di chiave candidata al quale puntano chiavi esterne esistenti. La clausola supporta anche le opzioni NO ACTION, CASCADE, SET NULL e SET DEFAULT.

Vincoli di colonna e di tabella

I vincoli possono essere di colonna o di tabella: Un vincolo di colonna viene specificato come parte di una definizione di colonna e si applica solo a quella colonna. I vincoli degli esempi precedenti sono vincoli di colonna. Un vincolo di tabella viene dichiarato indipendentemente dalla definizione di una colonna e può essere applicato a più colonne di una tabella. È possibile utilizzare i vincoli di tabella quando è necessario includere più colonne in un vincolo.

Ad esempio, se una tabella dispone di due o più colonne nella chiave primaria, è necessario utilizzare un vincolo di tabella per includere entrambe le colonne nella chiave primaria. Si supponga di disporre di una tabella per la registrazione degli eventi che si verificano in un computer di un impianto industriale. Si supponga quindi che possano verificarsi contemporaneamente eventi di tipo diverso, ma che due eventi simultanei non possano essere dello stesso tipo. È possibile applicare queste condizioni alla tabella includendo le colonne event_type e event_time in una chiave primaria a due colonne, come illustrato nell'esempio seguente.

CREATE TABLE factory_process
   (event_type   int,
   event_time   datetime,
   event_site   char(50),
   event_desc   char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )