Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

<PSQL>Relazioni tra Tabelle

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

<PSQL>Relazioni tra Tabelle

Messaggioda barbaraferrucci » gio giu 22, 2006 8:16 am

Ciao a tutti,
sono da poco alle prese con PostgreSQL , qualcuno saprebbe dirmi come si fa per creare delle tabelle dipendenti tra loro? Precisamente delle tabelle tali che variando i valori di una colonna in una, vengano automaticamente aggiornati i valori delle colonne corrispondenti delle altre. Naturalmente so già delle 'chiavi', ma non riesco a capire come si possano utilizzare a tale scopo.
Vi ringrazio anticipatamente!
Avatar utente
barbaraferrucci
Neo Iscritto
Neo Iscritto
 
Messaggi: 1
Iscritto il: mer giu 21, 2006 3:45 pm

Messaggioda 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.
Avatar utente
tux2
Neo Iscritto
Neo Iscritto
 
Messaggi: 22
Iscritto il: lun ago 07, 2006 10:08 am


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising