Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [MySql] Concetto di chiave esterna

    Ho bisogno di una delucidazione...ditemi se quello che ho capito è corretto o se sbaglio qualcosa.

    Facciamo conto che ho questa piccolissima base di dati (in realtà è parte di un esempio trovato su di un libro):

    impiegato(IDimpiegato, nome, mansione, IDdipartimento)

    dove: IDimpiegato è la CHIAVE ed IDdipartimento è la CHIAVE ESTERNA.

    dipartimento(IDdipartimento, nome)

    dove IDdipartimento è la CHIAVE.

    Il relativo codice SQL dato dal libro dove ho tratto l'esempio è:

    codice:
    create table dipartimento
    (
       IDdipartimento int not null auto_increment primary key,
       nome varchar(30)
    ) type=InnoDB;
    
    create table impiegato
    (
      IDimpiegato int not null auto_increment primary key,
      nome varchar(80),
      mansione varchar(30),
      IDdipartimento int not null references dipartimento(IDdipartimento)
    ) type=InnoDB;
    La cosa che non mi torna troppo è il concetto di chiave esterna che usa questo libro.
    L'altro libro usava il termine di chiave esterna per indicare un attributo di una tabella B che diventava parte della chiave di una tabella A per fare un esempio.
    Ho una tabella STUDENTE ed una tabella UNIVERSITA', ogni riga della tabella STUDENTE sarà identificata dal campo matricola proprio di STUDENTE ma anche dalla chiave straniera nomeuniversità "importata" dalla tabella UNIVERSITA' in quanto altrimenti due studenti appartenenti ad università diverse potrebbero avere la stessa matricola.

    Il libro dell'esempio precedente invece indica nella definizione delle tabelle il termine chiave esterna anche per indicare qualsiasi attributo pescato da un'altra tabella senza che questo alla fine non faccia efettivamente parte della chiave primaria della tabella in cui viene importato (come nell'esempio SQL da me riportato)...è giusto quello che ho capito o mi sfugge qualcosa?

    Altra piccola cosa (sempre se non ho preso fischi per fiaschi prima)...per esempio io ho importato nella tabella impiegato l'attributo IDdipartimento dalla tabella dipartimento tramite l'istruzione:

    IDdipartimento int not null references dipartimento(IDdipartimento)

    ma questa cosa che significa esattamente? che nella tabella impiegato i valori del campo IDdipartimento devono essere coerenti con quelli del campo IDdipartimento della tabella dipartimento?

    Per esempio non potrei inserire un valore in IDdipartimento di impiegato che non esiste già in IDdipartimento di dipartimento.

    Ho capito bene? Vi prego di aiutarmi che lunedì prossimo ho l'esame e sono disperato.

    Grazie
    Andrea

  2. #2
    La chiave esterna di una tabella non deve essere NECESSARIAMENTE parte di una chiave primaria anche se è quello il suo scopo.

    Solitamente ti troverai in una chiave esterna gli stessi valori contenuti in una chiave primaria (attenzione, una chiave in una tabella può essere composta anche da + DI UN CAMPO, in questo caso si dice SUPERCHIAVE, è logico che una chiave esterna se è su una sol colonna deve aver valori univoci).

    Quella riga che dici non capire fa proprio ciò che intuisci, facendo in modo che ci sia coerenza tra i valori delle due colonne di tabelle diverse.
    Ovviamente una chiave esterna PUO' per definizione aver valori NULL cosa che una chiave primaria non può avere, questo serve a garantire la possibilità di fare una relazione in cui non E' NECESSARIO che ci siano sempre dei campi come corrispondenza.
    Pensa ad un elenco di persone e ad un elenco di auto. Ci sono persone che hanno la loro auto e persone che non ce l'hanno. Poi possiamo anche immaginare che se c'è nella tabella auto una limousine non ci siano persone che la posseggono. In questo caso sono necessarie due chiavi esterne collegate alle chiavi primare delle due tabelle.

    Se vuoi un consiglio però le chiavi esterne fatte a mano. Le vecchie versioni di mysql non le supportano e quindi a me non piace usarle in modo da garantirmi la portabilità del codice!
    I dilettanti costruirono l'Arca, i professionisti il Titanic!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.