Domanda su foreign key (mysql)

Ho letto che dalla versione mysql 5.1 le fk saranno disponibili.

Ora è disponibile solo la 5 e da quello che ho capito le foreign key si possono usare  solo con le tabelle inndb. Se ho capito bene è necessario indicizzare gli attributi della tabella riferita (ma sempre?) , cmq dallla versione 4.1(di mysql)  in poi l'indicizzazione nn è automatica??

In pratica vorrei sapere se con la 5.0.x che ho io, usando i vincoli di integrità referenziale devo servirmi dell'indicizzazione , se si in quali casi (nel caso  nn bisogna sempre indicizzare) .

Quindi se sono necessari accorgimenti particolari x usare le FK rispettp a sql standard

mi potreste spiegare la sintassi (x mysql) , corredato con un piccolo esempio.

Ringrazio anticipatamente.

inviato 11 anni fa
viridovix
X 0 X

Tutte le versioni di MySQL (presenti e future) supportano le FK solo con le tabelle InnoDB (e con altre tabelle meno diffuse). Che io sappia le MyISAM non supporteranno le FK neanche in futuro.

Per quanto riguarda gli indici necessari all'uso delle FK ne ho già parlato qui:

http://www.phpnews.it/forum/index.php?topic=177.msg962#msg962

Ti riporto un semplice esempio: una tabella "genitori" ed una "figli" che referenzia "genitori"

CREATE TABLE genitori (
   id_genitore int(11) NOT NULL auto_increment,
   nome_genitore varchar(128) default NULL,
   PRIMARY KEY  (id_genitore) 
) ENGINE=InnoDB;

CREATE TABLE figli (
   id_figlio int(11) NOT NULL default '0',
   id_genitore int(11) default NULL,
   nome_figlio varchar(128) default NULL,
   PRIMARY KEY  (id_figlio),
   FOREIGN KEY (id_genitore) REFERENCES genitori (id_genitore)
) ENGINE=InnoDB;

nota come non è stato necessario creare nessun indice: per la tabella figli verrà creato automaticamente mentre per la tabella genitori il campo referenziato è già una chiave (primaria)

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Grazie x la risposta :)

Un dubbio mi rimane, se l'attributo referenziato (nel tuo caso id-genitore) lo avessi dichiarato unique (chiave nn primaria quindi) l'indicizzazione nn è + implicita?  dovrei provvedere io ? poi mi puoi fare un esempio in cui serve esplicitarla :)

X l'attributo referente invece l'indicizzazione è sempre implicita ?! (ho capito cosi' almeno)

Ah dimenticavo :

Di seguito viene riportato un elenco delle funzionalità aggiunte nelle ultime versioni del database server MySQL:

- Union dalla versione 4.0

- Subquery dalla versione 4.1

- Stored procedure dalla versione 5.0

- View dalla versione 5.0.1

- Cursori dalla versione 4.0

- Foreign key dalla versione 5.1 (dalla versione 3.23 sono disponibili per le tabelle InnoDB)

- Trigger dalla versione 5.0.2

- Full outer join dalla versione 5.1

- Costraint dalla versione 5.1

tratto da hxxp://openskills.info/topic.php?ID=193

risposto 11 anni fa
viridovix
X 0 X

Ho cercato in giro ed effettivamente sembra che MySQL 5.1 introdurrà le FK per tutti i tipi di tabella. Staremo a vedere  :o .

Poiché un attributo "UNIQUE" in realtà ha un indice, anche in questao caso non è necessario crearlo. Es.:

CREATE TABLE genitori ( 
  id_genitore int(11) NOT NULL auto_increment, 
  codice_fiscale varchar(32) default NULL,
  nome_genitore varchar(128) default NULL,
  PRIMARY KEY (id_genitore), 
  UNIQUE KEY (codice_fiscale) 
 ) ENGINE=InnoDB;


CREATE TABLE figli ( 
 id_figlio int(11) NOT NULL default '0', 
 CF_genitore varchar(32) default NULL,
 nome_figlio varchar(128) default NULL, 
 PRIMARY KEY (id_figlio),
 FOREIGN KEY (CF_genitore) REFERENCES genitori (codice_fiscale) 
 ) ENGINE=InnoDB;

Ora prova a togliere la riga "UNIQUE KEY (codice_fiscale)" e vedrai come la seconda tabella non possa essere creata, proprio per la mancanza di un indice per l'attributo referenziato nella prima tabella.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda