da tux2 » lun ago 07, 2006 1:53 pm
Immaginiamo di avere la tabella :
- Codice: Seleziona tutto
CREATE TABLE generi (
descrizione VARCHAR(16) NOT NULL
);
ALTER TABLE generi ADD CONSTRAINT generi_pk PRIMARY KEY ( descrizione);
CREATE TABLE libri (
descrizione VARCHAR(16),
titolo VARCHAR(256)
);
Immagiamo sempre che tu voglia che il database aggiorni il contenuto della campo libri.descrizione se questo variasse nella tabella generi.descrizione.
puoi ottenere questo scopo con una chiave esterna :
- Codice: Seleziona tutto
ALTER TABLE libri ADD CONSTRAINT libri_fk1 FOREIGN KEY ( descrizione) REFERENCES generi ( descrizione ) ON UPDATE CASCADE ON DELETE CASCADE
La definizione di questo vincolo crea un legame tra i due campi generi.descrizione e libri.descrizione dove il primo comanda sul secondo. E' possibile stabilire quale comportamento debba usare il database quando una voce dentro generi.descrizione cambia o viene cancellata. In questo caso (CASCADE) vengono modificate o cancellate anche le voci corrispondenti nella tabella libri.
Tieni presente che è possibile definire anche altri modificatori come :
NO ACTION (non fare niente, la voce sulla tabella libri rimarrebbe invariata e si perderebbe la chiave esterna se la tabella non fosse poi aggiornata manualmente)
RESTRICT (impedisci la cancellazione o modifica, in questo caso modifiche o cancellazioni su generi sarebbero possibili solo se non esistono voci nella tabella libri con descrizione uguale o se si compie l'operazione su entrambe le tabella in via transazionale).
Tieni infine presente, che potrebbe non essere una cattiva idea usare degli ID di sistema per le proprie tabelle e non ripetere mai i valori che vanno aggiornati su tabelle diverse :
- Codice: Seleziona tutto
CREATE TABLE generi (
id_genere BIGINT NOT NULL,
descrizione VARCHAR(16) NOT NULL
);
ALTER TABLE generi ADD CONSTRAINT generi_pk PRIMARY KEY ( id_genere );
CREATE TABLE libri (
id_genere NOT NULL,
titolo VARCHAR(256)
);
In tal caso la query standard su libri sarebbe :
- Codice: Seleziona tutto
SELECT l.titolo, a.descrizione FROM libri l, generi a WHERE l.id_genere=a.id_genere
Qualora ti servissero le stesse informazioni precedentemente fornite.
Le persone si dividono in 10 categorie,
quelle che conoscono il binario e quelle che non lo conoscono.