Clausola CONSTRAINT

Un vincolo è simile a un indice, anche se può essere usato per stabilire una relazione con un'altra tabella.

La clausola CONSTRAINT viene usata nelle istruzioni ALTER TABLE e CREATE TABLE per creare o eliminare vincoli. Esistono due tipi di clausole CONSTRAINT: una per la creazione di un vincolo su un singolo campo e una per la creazione di un vincolo su più campi.

Nota : Il motore di database di Microsoft Access non supporta l'uso di CONSTRAINT o di una qualsiasi istruzione DDL con database non Microsoft Access. In alternativa, usare i metodi DAO Create.

Sintassi

Vincolo a campo singolo:

CONSTRAINT nome {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabellachiaveesterna [(campochiaveesterna1, campochiaveesterna2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

Vincolo multicampo:

CONSTRAINT nome
{PRIMARY KEY (primaria1[, primaria2 [, ...]]) |
UNIQUE (univoca1[, univoca2 [, ...]]) |
NOT NULL (nonNull1[, nonNull2 [, ...]]) |
FOREIGN KEY [NO INDEX] (rif1[, rif2 [, ...]]) REFERENCES tabellachiaveesterna [(campochiaveesterna1 [, campochiaveesterna2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

La clausola CONSTRAINT è composta dalle parti seguenti:

Parte

Descrizione

nome

Nome del vincolo da creare.

primaria1, primaria2

Nome del campo o dei campi da designare come chiave primaria.

univoca1, 2

Nome del campo o dei campi da designare come chiave univoca.

nonNull1, nonNull2

Nome del campo o dei campi che sono limitati a valori non Null.

rif1, rif2

Nome di un campo o di campi a chiave esterna che fanno riferimento a campi in un'altra tabella.

tabellachiaveesterna

Nome della tabella della chiave esterna che contiene il campo o i campi specificati da campochiaveesterna.

campochiaveesterna1, 2

Nome del campo o dei campi nella tabellachiaveesterna specificata da rif1, rif2. È possibile omettere questa clausola se il campo di riferimento è la chiave primaria della tabellachiaveesterna.


Osservazioni

Usare la sintassi per un vincolo a campo singolo nella clausola della definizione di campo di un'istruzione ALTER TABLE o CREATE TABLE subito dopo la specifica del tipo di dati del campo.

Usare la sintassi per un vincolo multicampo ogni volta che si usa la parola riservata CONSTRAINT all'esterno di una clausola di definizione di campo in un'istruzione ALTER TABLE o CREATE TABLE.

Se si usa CONSTRAINT, è possibile designare un campo come uno dei tipi di vincoli seguenti:

  • È possibile usare la parola chiave UNIQUE per designare un campo come chiave univoca. Nella tabella non saranno quindi ammessi due record che presentano lo stesso valore in questo campo. È possibile vincolare come univoco qualsiasi campo o elenco di campi. Se si designa come chiave univoca un vincolo multicampo, i valori combinati di tutti i campi dell'indice devono essere univoci, anche se due o più record presentano lo stesso valore in uno solo dei campi.

  • È possibile usare le parole riservate PRIMARY KEY per designare come chiave primaria un campo o un set di campi in una tabella. Tutti i valori nella chiave primaria devono essere univoci e non Null. Può inoltre esistere una sola chiave primaria per una tabella.

    Nota : Non impostare un vincolo PRIMARY KEY su una tabella che contiene già una chiave primaria; in caso contrario, si verificherà un errore.

  • È possibile usare le parole riservate FOREIGN KEY per designare un campo come chiave esterna. Se la chiave primaria della tabella di chiave esterna è costituita da più campi, è necessario usare una definizione di vincolo multicampo, che elenca tutti i campi di riferimento, il nome della tabella di chiave esterna e i nomi dei campi di riferimento nella tabella di chiave esterna nello stesso ordine in cui sono elencati i campi di riferimento. Se il campo o i campi di riferimento sono la chiave primaria della tabella di chiave esterna, non è necessario specificare i campi di riferimento. Per impostazione predefinita, il motore di database si comporta come se la chiave primaria della tabella di chiave esterna corrispondesse ai campi di riferimento.

    I vincoli di chiave esterna definiscono le azioni specifiche da eseguire quando viene modificato un valore di chiave primaria corrispondente:

  • È possibile specificare le azioni da eseguire sulla tabella di chiave esterna sulla base di un'azione corrispondente eseguita su una chiave primaria della tabella in cui è definita la clausola CONSTRAINT. Ad esempio, esaminare la definizione seguente per la tabella Customers:

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

Esaminare la definizione seguente della tabella Orders, in cui viene definita una relazione di chiave esterna che fa riferimento alla chiave primaria della tabella Customers:

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE

Sulla chiave esterna sono definite una clausola ON UPDATE CASCADE e una clausola ON DELETE CASCADE. La clausola ON UPDATE CASCADE indica che se un identificativo del cliente (CustId) viene aggiornato nella tabella Customers, l'aggiornamento verrà propagato nella tabella Orders. Ogni ordine contenente un valore di identificativo del cliente corrispondente verrà aggiornato automaticamente con il nuovo valore. La clausola ON DELETE CASCADE indica che se un cliente viene eliminato dalla tabella Customers, verranno eliminate anche tutte le righe della tabella Orders contenenti lo stesso valore di identificativo del cliente.

Esaminare la diversa definizione della tabella Orders in cui viene usata l'azione SET NULL invece di CASCADE:

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL

La clausola ON UPDATE SET NULL indica che se un identificativo del cliente (CustId) viene aggiornato nella tabella Customers, i valori di chiave esterna corrispondenti nella tabella Orders verranno impostati automaticamente su NULL. Analogamente, la clausola ON DELETE SET NULL indica che se un cliente viene eliminato dalla tabella Customers, tutte le chiavi esterne corrispondenti nella tabella Orders verranno impostate automaticamente su NULL.

Per impedire la creazione automatica di indici per le chiavi esterne, è possibile usare il modificatore NO INDEX. Questa forma di definizione di chiave esterna deve essere usata solo nei casi in cui i valori di indice risultati siano duplicati frequentemente. Quando i valori in un indice di chiave esterna vengono duplicati frequentemente, l'uso di un indice può risultare meno efficace rispetto alla semplice esecuzione di una scansione di tabella. La gestione di questo tipo di indice, con righe inserite ed eliminate dalla tabella, comporta una riduzione delle prestazioni e non offre alcun vantaggio.



Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa al programma Office Insider

Queste informazioni sono risultate utili?

Grazie per i tuoi commenti e suggerimenti

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×