Ik ben een database aan het opzetten met phpMyAdmin. Ik heb twee tabellen (foo
en bar
), geïndexeerd op hun primaire sleutels. Ik probeer een relationele tabel (foo_bar
) tussen hen te maken, met hun primaire sleutels als foreign keys.
Ik heb deze tabellen als MyISAM aangemaakt, maar heb ze sindsdien alle drie veranderd naar InnoDB, omdat ik gelezen heb dat MyISAM'geen foreign keys ondersteunt. Alle id
velden zijn INT(11)
.
Wanneer ik de foo_bar
tabel kies, klik op de "relation view" link, en probeer de FK kolommen in te stellen als database.foo.id
en database.bar.id
, dan staat er "No index defined!" naast elke kolom.
Wat zie ik over het hoofd?
Om het eenvoudig te houden, wil ik phpMyAdmin blijven gebruiken. Ik gebruik momenteel XAMPP, wat makkelijk genoeg is om me te laten concentreren op de PHP/CSS/Javascript, en het komt met phpMyAdmin.
Ook, hoewel ik nog niet in staat ben geweest om expliciete foreign keys op te zetten, heb ik wel een relationele tabel en kan ik joins als deze uitvoeren:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
Het maakt me gewoon ongemakkelijk om de FK's niet expliciet in de database gedefinieerd te hebben.
Als je phpMyAdmin wil gebruiken om relaties op te zetten, moet je 2 dingen doen. Eerst en vooral moet je een index definiëren op de foreign key kolom in de verwijzende tabel (dus foo_bar.foo_id, in jouw geval). Vervolgens ga je naar relatie view (in de verwijzende tabel) en selecteer je de verwijzende kolom (dus in jouw geval foo.id) en de on update en on delete acties.
Ik denk dat foreign keys handig zijn als je meerdere tabellen aan elkaar gekoppeld hebt, met name je delete scripts worden dan erg kort als je de referencing opties goed instelt.
EDIT: Zorg ervoor dat beide tabellen de InnoDB engine geselecteerd hebben.
Met phpMyAdmin kunt u foreign keys definiëren met behulp van hun "relations" view. Maar aangezien MySQL alleen foreign constraints ondersteunt op "INNO DB" tabellen, is de eerste stap om er zeker van te zijn dat de tabellen die u gebruikt van dat type zijn.
Om een foreign key op te zetten zodat de PID kolom in een tabel met de naam CHILD verwijst naar de ID kolom in een tabel met de naam PARENT, kun je het volgende doen:
Door een export te doen op de CHILD tabel, zou je moeten zien dat er een foreign key constraint is gemaakt voor de PID kolom.
InnoDB staat u toe om een nieuwe foreign key constraint aan een tabel toe te voegen door ALTER TABLE te gebruiken:
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]
Aan de andere kant, als MyISAM voordelen heeft boven InnoDB in jouw context, waarom zou je dan überhaupt foreign key constraints willen maken. U kunt dit afhandelen op het model niveau van uw applicatie. Zorg er alleen voor dat de kolommen die je als foreign keys wilt gebruiken geïndexeerd zijn!