PDA

Visualizza la versione completa : [sql]foreign key


Dorcan82
26-10-2004, 22:30
domanda stupida, più dettata dallo scrupolo:

due tabelle Impiegato e dipartimento legate da foreign key.

la tabella interna è quella che contiene il foreign key e il reference.

la tabella interna è impiegato e l'esterna è dipartimento

Il vincolo può essere violato se aggiungo righe in impiegato oppure se modifico il valore dell'attributo referente che non è contenuto in dipartimento.

Poi: in dipartimento, la modifica dell'attributo oggetto del vincolo e l'eliminazione di un valore di questo ultimo possono violare il vincolo.


Ora: le tabelle sono vuote e devo inserire un dipendente che lavora in un dato dipartimento...come faccio senza che il vincolo venga violato???? dovrei inserire in contemporanea. Come faccio????

:ciauz: :ciauz:

alka
26-10-2004, 22:39
Originariamente inviato da Dorcan82
Ora: le tabelle sono vuote e devo inserire un dipendente che lavora in un dato dipartimento...come faccio senza che il vincolo venga violato???? dovrei inserire in contemporanea.
E' semplice: non puoi. :)

Indipendentemente da come si comporterà visualmente l'applicazione che stai realizzando (suppongo che tu stia facendo questo), il dato relativo al dipartimento dovrà essere inserito per primo ottenendo inoltre il suo reference che dovrà essere utilizzato per la stesura dei dati dell'impiegato da salvare successivamente.

Ciao! :ciauz:

Dorcan82
26-10-2004, 22:49
quindi devo popolare prima dipartimento e poi impiegato????

un'altra cosa: se setto un cascade, questo dovrebbe significare che se cambio il nome di un dipartimento, l'update si riperquoterà anche su impiegato con quel tipo di dipartimento????
Quindi se informatica diventa meccanica, verranno aggiornati i dati di impiegato che contengono informatica cambiando in meccanica????

alka
26-10-2004, 22:59
Originariamente inviato da Dorcan82
quindi devo popolare prima dipartimento e poi impiegato????

Yes.


Originariamente inviato da Dorcan82
un'altra cosa: se setto un cascade, questo dovrebbe significare che se cambio il nome di un dipartimento, l'update si riperquoterà anche su impiegato con quel tipo di dipartimento????

L'opzione CASCADE indica che quando cambi il valore della chiave (foreign key), il valore viene aggiornato nella tabella correlata mantenendo intatta la relazione tra i due record interessati.


Originariamente inviato da Dorcan82
Quindi se informatica diventa meccanica, verranno aggiornati i dati di impiegato che contengono informatica cambiando in meccanica????
No, il campo descrittivo non c'entra nulla, perchè non è quel campo che stabilisce la relazione bensì il campo scelto come chiave, che preferibilmente dovrebbe essere numerico...a meno che tu non abbia impostato il campo descrittivo ("informatica", "meccanica", ecc.) come campo chiave (foreign key).

Comunque, specifica sempre il database su cui lavori nelle tue domande.

Ciao! :ciauz:

Dorcan82
26-10-2004, 23:06
si la chiave è il nome del dipartimento.

:ciauz:

Dorcan82
26-10-2004, 23:07
uso MySQL, ma a quanto pare non supporta i vincoli di integrità referenziale

alka
27-10-2004, 00:58
Originariamente inviato da Dorcan82
si la chiave è il nome del dipartimento.
Non è una buona scelta: è preferibile usare un campo numerico, magari autoincrementale, invece di un campo alfanumerico.

Qual è il vantaggio - in questo caso - di utilizzare una tabella esterna se l'informazione più ingombrante, cioè il campo descrittivo, viene replicata per ogni record della tabella dipendente (quella degli impiegati)? :)

internet
27-10-2004, 19:41
Originariamente inviato da Dorcan82
uso MySQL, ma a quanto pare non supporta i vincoli di integrità referenziale

Devi usare le tabelle InnoDB, se vuoi l'integrità referenziale.



CREATE TABLE foo (
fooID int(11) NOT NULL auto_increment,
depID int(11),
PRIMARY KEY (userID),
KEY depID (depID),
FOREIGN KEY (depID) REFERENCES department (depID)
) TYPE=InnoDB;


ma non supporta questa sintassi standard



CREATE TABLE foo (
fooID int(11) NOT NULL auto_increment,
depID int(11) references department (depID)
) TYPE=InnoDB;

Loading