Jeg setter opp en database ved hjelp av phpMyAdmin. Jeg har to tabeller (foo
og bar
), indeksert på deres primærnøkler. Jeg prøver å lage en relasjonell tabell (foo_bar
) mellom dem, ved å bruke primærnøklene deres som fremmednøkler.
Jeg opprettet disse tabellene som MyISAM, men har siden endret alle tre til InnoDB, fordi jeg leste at MyISAM ikke støtter fremmednøkler. Alle id
-feltene er INT(11)
.
Når jeg velger tabellen foo_bar
, klikker på lenken relasjonsvisning
og prøver å sette FK-kolonnene til å være database.foo.id
og database.bar.id
, står det "Ingen indeks definert!" ved siden av hver kolonne.
Hva er det jeg går glipp av?
For enkelhets skyld vil jeg fortsette å bruke phpMyAdmin. Jeg bruker for øyeblikket XAMPP, som er enkelt nok til å la meg fokusere på PHP/CSS/Javascript, og det kommer med phpMyAdmin.
Selv om jeg ikke har vært i stand til å sette opp eksplisitte utenlandske nøkler ennå, har jeg en relasjonell tabell og kan utføre sammenføyninger som dette:
SELECT *
FROM foo
INNER JOIN foo_bar
ON foo.id = foo_bar.foo_id
INNER JOIN bar
ON foo_bar.bar_id = bar.id;
Det gjør meg bare ubehagelig å ikke ha FK-ene eksplisitt definert i databasen.
Hvis du vil bruke phpMyAdmin til å sette opp relasjoner, må du gjøre to ting. Først og fremst må du definere en indeks på fremmednøkkelkolonnen i henvisningstabellen (i ditt tilfelle foo_bar.foo_id). Deretter går du til relasjonsvisningen (i den refererende tabellen) og velger den refererte kolonnen (i ditt tilfelle foo.id) og handlingene for oppdatering og sletting.
Jeg tror fremmednøkler er nyttige hvis du har flere tabeller som er koblet til hverandre, spesielt vil sletteskriptene dine bli veldig korte hvis du angir referansealternativene riktig.
EDIT: Forsikre deg om at begge tabellene har InnoDB-motoren valgt.
phpMyAdmin lar deg definere fremmednøkler ved hjelp av deres "relasjoner" -visning. Men siden MySQL bare støtter utenlandske begrensninger på "INNO DB" -tabeller, er det første trinnet å sørge for at tabellene du bruker er av den typen.
For å sette opp en fremmednøkkel slik at PID-kolonnen i en tabell med navnet CHILD refererer til ID-kolonnen i en tabell med navnet PARENT, kan du gjøre følgende:
Ved å gjøre en eksport på CHILD-tabellen, bør du se at det er opprettet en fremmednøkkelbegrensning for PID-kolonnen.
InnoDB lar deg legge til en ny fremmednøkkelbegrensning i en tabell ved å bruke 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]
På den annen side, hvis MyISAM har fordeler i forhold til InnoDB i din kontekst, hvorfor vil du i det hele tatt opprette fremmednøkkelbegrensninger. Du kan håndtere dette på modellnivå i applikasjonen din. Bare sørg for at kolonnene du vil bruke som fremmednøkler er indeksert!