Articles

Definizione dei vincoli all’interno di CREATE TABLE in Oracle 12c

È possibile utilizzare l’istruzione CREATE TABLE per applicare diversi tipi di vincoli su una tabella: chiavi candidate, chiavi primarie, chiavi esterne e condizioni di controllo. Una clausola di VINCOLO può vincolare una singola colonna o un gruppo di colonne in una tabella. Il punto di questi vincoli è quello di convincere Oracle a fare la maggior parte del lavoro per mantenere l’integrità del database. Più vincoli si aggiungono a una definizione di tabella, meno lavoro si deve fare nelle applicazioni per mantenere i dati. D’altra parte, più vincoli ci sono in una tabella, più tempo ci vuole per aggiornare i dati.

È possibile specificare i vincoli in due modi: come parte della definizione di colonna (nota come vincolo di colonna) o alla fine dell’istruzione CREATE TABLE (nota come vincolo di tabella). Le clausole che vincolano più colonne devono essere vincoli di tabella.

La chiave Candidate

Una chiave candidate è una combinazione di una o più colonne, i cui valori identificano in modo univoco ogni riga di una tabella. Il seguente elenco mostra la creazione di un vincolo UNIVOCO per la tabella dei PROBLEMI:

La chiave per questa tabella è la combinazione di CITY e SAMPLE_DATE. Si noti che entrambe le colonne sono anche dichiarate NON NULL. Questa funzione richiede di specificare i valori per alcune colonne in modo che le righe da inserire. Chiaramente, le informazioni sulla temperatura e sulle precipitazioni non sono utili senza sapere dove o quando sono state raccolte. Questa tecnica è comune per le colonne che sono la chiave primaria della tabella, ma è anche utile se alcune colonne sono fondamentali per la riga di dati significativi. Se NOT NULL non è specificato, la colonna può avere valori NULL.

Quando si crea un vincolo UNIVOCO, Oracle crea un indice univoco per imporre l’unicità dei valori. All’interno di un vincolo di chiave primaria, almeno una delle colonne nella chiave primaria per ogni riga deve essere NOT NULL.

La chiave primaria

La chiave primaria di una tabella è una delle chiavi candidate che si danno alcune caratteristiche speciali. È possibile avere una sola chiave primaria e una colonna di chiave primaria non può contenere valori NULL.

La seguente istruzione CREATE TABLE ha lo stesso effetto come la precedente, con la differenza che si può avere diversi vincoli, ma solo un vincolo di CHIAVE PRIMARIA:

Per colonna singola primaria o chiavi candidate, è possibile definire la chiave nella colonna con un vincolo di colonna, invece di un vincolo di tabella:

In questo caso, il AUTHOR_NAME colonna è la chiave primaria, e Oracle genererà un nome per il vincolo di CHIAVE PRIMARIA. Questo non è raccomandato se si desidera applicare uno standard di denominazione comune per le chiavi, come discusso più avanti in “Vincoli di denominazione.”

Che designa i tablespace dell’indice

I vincoli di CHIAVE univoci e PRIMARI creano indici. A meno che tu non dica diversamente a Oracle, quegli indici sono posizionati nel tuo tablespace predefinito. Per specificare uno spazio tabella diverso, utilizzare la clausola USING INDEX TABLESPACE del comando CREATE TABLE, come mostrato nel seguente elenco:

L’indice associato al vincolo della chiave primaria AUTHOR_PK verrà inserito nello spazio tabella UTENTI.

NOTA

Nella maggior parte delle installazioni predefinite, viene creato lo spazio tabella UTENTI ed è lo spazio tabella predefinito.

La chiave esterna

Una chiave esterna è una combinazione di colonne con valori basati sui valori della chiave primaria di un’altra tabella. Un vincolo di chiave esterna, noto anche come vincolo di integrità referenziale, specifica che i valori della chiave esterna corrispondono ai valori effettivi della chiave primaria nell’altra tabella. Nella tabella BOOKSHELF, ad esempio, la colonna CATEGORY_NAME fa riferimento ai valori per la colonna CATEGORY_NAME nella tabella delle CATEGORIE:

È possibile fare riferimento a una chiave primaria o univoca, anche nella stessa tabella. Tuttavia, non è possibile fare riferimento a una tabella in un database remoto nella clausola REFERENCES. È possibile utilizzare il modulo tabella (utilizzato in precedenza per creare una chiave PRIMARIA nella tabella dei PROBLEMI) anziché il modulo colonna per specificare chiavi esterne con più colonne.

A volte potresti voler eliminare queste righe dipendenti quando elimini la riga da cui dipendono. Nel caso di BOOKSHELF e CATEGORY, se si elimina un CATEGORY_NAME da CATEGORY, è possibile rendere NULLI i valori della colonna CATEGORY_NAME BOOKSHELF corrispondenti. In un altro caso, potresti voler eliminare l’intera riga. La clausola SU DELETE CASCADE aggiunta alla clausola REFERENCES indica a Oracle di eliminare la riga dipendente quando si elimina la riga corrispondente nella tabella padre. Questa azione mantiene automaticamente l’integrità referenziale.

Il Vincolo di CONTROLLO

Molte colonne devono avere valori che rientrano in un determinato intervallo o che soddisfano determinate condizioni. Con un vincolo di CONTROLLO, è possibile specificare un’espressione che deve essere sempre vera per ogni riga della tabella. Per esempio, la tabella di VALUTAZIONE di negozi valido valutazioni; per limitare i valori oltre i limiti imposti dalla definizione di colonna, è possibile utilizzare un vincolo di CONTROLLO, come mostrato nel listato seguente:

Una colonna di CONTROLLO a livello di vincolo non può fare riferimento a valori in altre righe; non i pseudo-colonne come SYSDATE, UTENTE, CURRVAL, NEXTVAL, LIVELLO, e ROWNUM. È possibile utilizzare il modulo vincolo tabella (al contrario del modulo vincolo colonna) per fare riferimento a più colonne in un vincolo di CONTROLLO.

Vincoli di denominazione

Puoi nominare i tuoi vincoli. Se si utilizza uno schema di denominazione efficace per i nomi dei vincoli, sarà possibile identificare e gestire meglio i vincoli. Il nome di un vincolo deve identificare la tabella su cui agisce e il tipo di vincolo che rappresenta. Ad esempio, la chiave primaria nella tabella dei PROBLEMI potrebbe essere denominata TROUBLE_PK.

È possibile specificare un nome per un vincolo quando si crea il vincolo. Se non si specifica un nome per il vincolo, Oracle genera un nome. La maggior parte dei nomi di vincoli generati da Oracle sono nella forma SYS_C###### (ad esempio, SYS_C000145). Poiché il nome del vincolo generato dal sistema non indica nulla sulla tabella o sul vincolo, è necessario assegnare un nome ai vincoli.

Nell’esempio seguente, il vincolo della CHIAVE PRIMARIA viene creato e denominato, come parte del comando CREA TABELLA per la tabella dei PROBLEMI (si noti la clausola di VINCOLO):

La clausola di VINCOLO del comando CREATE TABLE nomina il vincolo (in questo caso TROUBLE_PK). È possibile utilizzare questo nome di vincolo in seguito quando si abilitano o disabilitano i vincoli.