PostgreSQL SECONDA PUNTATA (TRIGGER oppure FOREIGN KEY)

Entriamo nel sistema come utente postgres e creare il db
chiamandolo con qualsiasi nome

/usr/local/postgresql-7.x.x/bin/createdb nomedb

Ed ora entriamo nel db

/usr/local/postgresql-7.x.x/bin/psql nomedb

Immaginiamo che nel nostro database dobbiamo registrare ogni cognome
ad una città, però può capitare che un cognome sia presente in più
città e vogliamo che ogni qual volta effettuiamo una cancellazione
il tutto faccia rimanere il database sempre coerente, quindi
usiamo le FOREIGN KEY(I Trigger impliciti):

CREATE SEQUENCE nm_seq;
questo comando lo dobbiamo creare ogni qual volta creiamo una tabella
dove abbiamo bisogno di un valore autoincrementale unico,
naturalmente il nome della SEQUENCE la scegliete voi.

CREATE SEQUENCE nm_seq;
CREATE TABLE cognomi (
n_id INTEGER DEFAULT NOT NULL nextval('nm_seq'),
cognomi VARCHAR(65) NOT NULL,
CONSTRAINT n_pk PRIMARY KEY (n_id)
);

CREATE SEQUENCE ctt_seq;
CREATE TABLE citta (
c_id INTEGER DEFAULT NOT NULL nextval('ctt_seq'),
citta VARCHAR(80) NOT NULL,
CONSTRAINT c_pk PRIMARY KEY (c_id)
);

CREATE SEQUENCE co_ci_seq;
CREATE TABLE co_ci (
cc_id INTEGER DEFAULT NOT NULL nextval('co_ci_seq'),
n_id VARCHAR(80),
c_id VARCHAR(80),
CONSTRAINT a_pk PRIMARY KEY (cc_id),
CONSTRAINT n_fk FOREIGN KEY(n_id) REFERENCES cognomi(n_id)
ON DELETE CASCADE,
CONSTRAINT c_fk FOREIGN KEY(c_id) REFERENCES citta(c_id)
ON DELETE CASCADE
);
Leggete bene la FOREGIN KEY in modo da capire!

Bene ora abbiamo creato tre tabelle dove in cognomi andiamo ad
inserire vari dati mentre nella tabella citta(lo so che ci vuole
l'accento) inseriamo gli altri dati:

INSERT INTO cognomi(cognomi) VALUES ("Saibal");
INSERT INTO citta(citta) VALUES ("Roma");

Però inseriamone almeno 5 per tabella.
Ora che abbiamo un pò di dati nel db possiamo inziare a fare
inserimenti nella tabella co_ci

INSERT INTO co_ci(n_id,c_id) VALUES(1,1);

In questo inserimento non possiamo inserire quello che ci pare,
visto che abbiamo creato i vincoli tra tabelle, quindi saranno
accettati gli id effettivamente esistenti nelle altre tabelle.
Quindi mettiamo caso che al cognome saibal è stato dato nella
tabella cognomi 1 e alla città Roma nella tabella citta è stato
dato 1, allora l'inserimento avviene senza problemi.

Ora però noi vogliamo visualizzare i dati presenti dentro la
tabella co_ci:

SELECT * FROM co_ci;

Vediamo solo numeri, ma se volessimo trasformare quei numeri in
informazioni vere e proprie?
La risposta sono le 'join' che permettono di incrociare i dati.
Ma vediamo come impostare la nostra join

SELECT cognomi.cognomi,citta.citta FROM cognomi,citta,co_ci WHERE
cognomi.n_id=co_ci.n_id AND citta.c_id=co_ci.c_id

Ora se vediamo l'output possiamo vedere che i dati non sono numerici,
ma abbiamo le due tabelle virtualmente insieme.
Ora vi basterà ammazzarvi con un pò di join per averle bene in mente.
Se ora proviamo a cancellare un dato dalla tabella cognomi,
possiamo vedere che nella tabella co_ci vengono cancellate tutte
le righe dove era presente l'id del record cancellato nella tabella
cognomi, stessa cosa se proviamo a cancellare qualche città.

Se volete cancellare una tabella ricordatevi di cancellare anche il
sequence

DROP TABLE cognomi;
DROP SEQUENCE nm_seq;

Signori vi aspetto ala prossima puntata!

FINE SECONDA PUNTATA