Impostare le chiavi esterne in phpMyAdmin?

Sto creando un database usando phpMyAdmin. Ho due tabelle (foo e bar), indicizzate sulle loro chiavi primarie. Sto cercando di creare una tabella relazionale (foo) tra di loro, usando le loro chiavi primarie come chiavi esterne.

Ho creato queste tabelle come MyISAM, ma da allora ho cambiato tutte e tre in InnoDB, perché ho letto che MyISAM non supporta le chiavi esterne. Tutti i campi id sono INT(11).

Quando scelgo la tabella foo_bar, clicco sul link "relation view" e provo a impostare le colonne FK come database.foo.id e database.bar.id, dice "No index defined!" accanto a ciascuna colonna.

Cosa mi manca?

Chiarimento/Aggiornamento

Per il bene della semplicità, voglio continuare ad usare phpMyAdmin. Attualmente sto usando XAMPP, che è abbastanza facile da lasciarmi concentrare su PHP/CSS/Javascript, e viene fornito con phpMyAdmin.

Inoltre, anche se non sono ancora stato in grado di impostare chiavi esterne esplicite, ho una tabella relazionale e posso eseguire join come questo:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Mi mette solo a disagio non avere le FK esplicitamente definite nel database.

Soluzione

Se vuoi usare phpMyAdmin per impostare le relazioni, devi fare 2 cose. Prima di tutto, dovete definire un indice sulla colonna foreign key nella tabella di riferimento (quindi pippo_bar.pippo_id, nel vostro caso). Poi, vai alla vista relazioni (nella tabella di riferimento) e seleziona la colonna di riferimento (quindi nel tuo caso pippo.id) e le azioni on update e on delete.

Penso che le chiavi esterne siano utili se hai più tabelle collegate l'una all'altra, in particolare, i tuoi script di cancellazione diventeranno molto brevi se imposti correttamente le opzioni di riferimento.

EDIT: Assicurati che entrambe le tabelle abbiano il motore InnoDB selezionato.

Commentari (5)

phpMyAdmin ti permette di definire le chiavi esterne usando la loro vista "relations". Ma poiché MySQL supporta solo i vincoli esterni sulle tabelle "INNO DB", il primo passo è assicurarsi che le tabelle che stai usando siano di quel tipo.

Per impostare una chiave esterna in modo che la colonna PID in una tabella chiamata CHILD faccia riferimento alla colonna ID in una tabella chiamata PARENT, potete fare come segue:

  1. Per entrambe le tabelle, vai alla scheda operazioni e cambia il loro tipo in "INNO DB"
  2. Assicuratevi che ID sia la chiave primaria (o almeno una colonna indicizzata) della tabella PARENT.
  3. Nella tabella CHILD, definite un indice per la colonna PID.
  4. Mentre visualizzate la scheda struttura della tabella CHILD, cliccate sul link "vista relazione" appena sopra la sezione "aggiungi campi".
  5. Vi sarà data una tabella in cui ogni riga corrisponde a una colonna indicizzata nella vostra tabella CLIENT. Il primo menù a tendina di ogni riga ti permette di scegliere a quale TABLE->COLONNA fa riferimento la colonna indicizzata. Nella riga per PID, scegliete PARENT->ID dal menu a tendina e cliccate su GO.

Facendo un'esportazione sulla tabella CHILD, si dovrebbe vedere che è stato creato un vincolo di chiave esterna per la colonna PID.

Commentari (1)

InnoDB permette di aggiungere un nuovo vincolo di chiave esterna a una tabella usando ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

D'altra parte, se MyISAM ha dei vantaggi rispetto a InnoDB nel tuo contesto, perché vorresti creare dei vincoli di chiave esterna? Puoi gestire questo a livello di modello della tua applicazione. Assicurati solo che le colonne che vuoi usare come chiavi esterne siano indicizzate!

Commentari (3)