I 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 );
Inseriamo ora in tabella due nuove righe che violano i constraint impostati.
SQL> INSERT INTO myTableNull VALUES (NULL, 'Sergio');
SQL> INSERT INTO myTableNull VALUES ('Napolitano', NULL);
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);
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);