Questo sito contribuisce alla audience di

Creazione di tabelle. Terza parte

Continua la descrizione della create table, focalizzando l'attenzione sulla definizione dei vincoli.

I constraint definiti nel precedente intervento sono anche detti constraint a livello di campo, in quanto sono definiti su di un solo campo alla volta.

Vediamo come definire un vincolo che coinvolga piu’ campi (constraint a livello di tabella), definendo uno unique sulle colonne nome,cognome (e’ un vincolo esageratamente restrittivo, in quanto possono esistere due persone con lo stesso nome e cognome), contemporaneamente forniamo anche un nome ad ogni constraint:

CREATE TABLE impiegati(
matricola VARCHAR2(4) NOT NULL CONSTRAINT PK_IMPIEGATI PRIMARY KEY,
nome VARCHAR2(20) NOT NULL,
cognome VARCHAR2(20) NOT NULL,
superiore VARCHAR2(4)CONSTRAINT FK_IMP_SUP REFERENCES impiegati(matricola),
data_ass DATE,
salario NUMBER(9),
sede NUMBER NOT NULL CONSTRAINT FK_IMP_SEDI REFERENCES sedi(sede), CONSTRAINT U_SEDI_NOME_COGN UNIQUE(nome,cognome));

Quindi un vincolo che coinvolge piu’ campi deve essere obbligatoriamente definito al termine dell’istruzione di create, dopo la definizione di tutte le colonne. Utilizzando la parola chiave CONSTRAINT e’ possibile fornire un nome al vincolo, in questo modo risulta piu’ facile,in caso di violazione di un constraint capire, dal nome, quale fra i tanti e’ stato violato. Oracle, ad esempio, assegna di default nomi tipo SYS00345, quindi poco significativi, mentre un nome come PK_IMPIEGATI ci fa subito capire che si tratta di una primary key sulla tabella impiegati. Non esistono regole per decidere il nome da assegnare al vincolo, conviene pero’, all’interno di uno stesso progetto definire delle regole, in modo da avere nomi omogenei.

A questo punto, visto che e’ stato definito uno unique su nome e cognome, non sara’ piu’ possibile inserire due record con la stessa coppia di nome,cognome. Potremo avere quindi un Mario Bianchi e un Mario Rossi ma
non due Mario Bianchi. Potremo pero’ inserire un Mario Bianchi ed un MARIO BIANCHI, in quanto si tratta di due stringhe diverse.

Una possibile soluzione, in fase di creazione della tabella, potrebbe essere quella di utilizzare un check:

CREATE TABLE impiegati(
………
nome VARCHAR2(20) NOT NULL CONSTRAINT CK_NOME CHECK (nome = UPPER(nome)),
cognome VARCHAR2(20) NOT NULL CONSTRAINT CK_COGNOME CHECK (cognome = UPPER(cognome)),
……….. .

L’ustruzione UPPER, rende la stringa tutta maiuscola (la complementare e’ la LOWER).

In questo modo e’ permesso solo l’inserimento di nomi e cognomi tutti maiuscoli, in modo da garantire l’unicita’ delle coppie nome-cognome, ma non solo, in quanto si garantisce anche che in fase di estrazione dei dati, quindi una select, filtrando su valori tutti maiuscoli si ha la certezza di estrarre tutti i dati che soddisfano il filtro.

In questo modo pero’ si obbliga chi scrive l’applicazione che inserira’ i record nella tabella a rendere le stringhe tutte maiuscole per evitare di violare il vincolo. Un’alternativa a questa soluzione consiste nell’utilizzo dei trigger, che vedremo prossimamente, che in maniera trasparente all’utente rendono la stringa maiuscola, subito prima dell’inserimento.

Le categorie della guida