Vincoli di controllo sui dati

constraint (o vincoli), sono delle regole che vengono stabilite all’interno di una tabella Oracle che servono ad evitare che l’utente possa inserire dati non conformi ad alcune regole. Queste regole possono preservare l’inserimento dei dati o l’integrità referenziale tra le tabelle.

Possono essere dichiarati sia in fase di creazione tabella (CREATE TABLE), sia in fase di modifica della tabella (ALTER TABLE). Se il constraint è applicato ad una singola colonna allora è detto constraint di colonna, altrimenti se è applicato a più di una colonna è detto constraint di tabella.

Durante la dichiarazione del vincolo possiamo associargli un nome (usando la clausola CONSTRAINT), in caso contrario sarà Oracle a definirne uno di sistema (inizierà sempre con il prefisso SYS_). I vincoli vengono memorizzati da Oracle nel dizionario dei dati.

Nota: In tutti gli esempi riportati in questo capitolo usiamo l’utente “myself” creato nelle lezioni precedenti.

Constraint NOT NULL

Può essere definito esclusivamente su una singola colonna della tabella. La sua funzione è quella di evitare che l’utente possa inserire valori nulli (NULL) nella colonna associata, pertanto questa dovrà sempre contenere un valore diverso da NULL.

Sinstassi del vincolo NOT NULL

<nome colonna> <tipo> CONSTRAINT <nome vincolo> NOT NULL

Sinstassi del vincolo NOT NULL (anonimo)

<nome colonna> <tipo> NOT NULL

Per esempio creiamo una tabella denominata “myTableNull” avente due colonne, entrambe “NOT NULL” e ne visualizziamo la struttura.

SQL> CREATE TABLE myTableNull
  2 ( 
  3  Cognome VARCHAR2(15) CONSTRAINT nn_myTableNull_Cognome NOT NULL,
  4  Nome VARCHAR2(15) CONSTRAINT nn_myTableNull_Nome NOT NULL
  5 );
Struttura della tabella

Inseriamo ora in tabella due nuove righe che violano i constraint impostati.

SQL> INSERT INTO myTableNull VALUES (NULL, 'Sergio');
Risultato della query
SQL> INSERT INTO myTableNull VALUES ('Napolitano', NULL);
Risultato della query

In entrambi gli esempi Oracle solleva un errore ORA-01400 perché abbiamo provato ad inserire un valore NULL in colonne protette dal vincolo NOT NULL.

Se volessimo successivamente permettere, nella stessa tabella, l’inserimento di valori NULL per la colonna Nome allora scriveremmo:

SQL> ALTER TABLE myTableNull MODIFY Nome NULL;

Stavolta l’inserimento con del valore NULL per la colonna “Nome” andrà a buon fine.

Constraint CHECK

Questo vincolo effettua un controllo sui dati e ne evita l’inserimento se questi non rispettino una determinata condizione, imposta dal creatore della tabella.

Sintassi del vincolo CHECK

CONSTRAINT <nome> CHECK <condizione>

Per esempio creiamo una tabella denominata “myTableCheck” e imposteremo un constraint CHECK per la colonna “Stipendio”. Il vincolo non consentirà l’inserimento di valori numerici inferiori od uguali a 980.50 nella colonna protetta.

SQL> CREATE TABLE myTableCheck
  2 (
  3   Cognome VARCHAR2(15),
  4   Stipendio NUMBER (6,2),
  5   CONSTRAINT ck_myTableCheck_Stipendio CHECK (Stipendio > 980.50)
  6 );

Inseriamo una riga nella tabella myTableCheck che viola la condizione imposta dal constraint.

SQL> INSERT INTO myTableCheck VALUES ('Rossi', 754.40);
Risultato della query

Oracle solleva l’errore ORA-02290 riportando anche il nome del constraint violato. Il seguente comando, invece, va a buon fine.

SQL> INSERT INTO myTableCheck VALUES ('Verdi', 1000.50);

Facciamo un altro esempio e creiamo una tabella denominata “Prova” con un vincolo CHECK definito a livello di tabella. È dichiarato a livello di tabella perché agisce su due colonne (Bonus e Salario).

SQL> CREATE TABLE Prova
  2 (
  3   Nominativo VARCHAR2(15),
  4   Salario NUMBER(6,2),
  5   Bonus NUMBER(6,2),
  6   CONSTRAINT ck_Prova_SalBon CHECK (Bonus < Salario)
  7 );

Se inseriamo nella tabella appena creata una riga che violi il constraint CHECK otteniamo un errore.

SQL> INSERT INTO prova VALUES ('Verdi', 1000.50, 2000);
Both comments and pings are currently closed.

Comments are closed.