Fremdschlüssel in phpMyAdmin einrichten?

335

Ich richte eine Datenbank mit phpMyAdmin ein. Ich habe zwei Tabellen ( foound bar), die auf ihren Primärschlüsseln indiziert sind . Ich versuche, eine relationale Tabelle ( foo_bar) zwischen ihnen zu erstellen , wobei ihre Primärschlüssel als Fremdschlüssel verwendet werden.

Ich habe diese Tabellen als MyISAM erstellt, aber seitdem alle drei in InnoDB geändert, da ich gelesen habe, dass MyISAM keine Fremdschlüssel unterstützt. Alle idFelder sind INT(11).

Wenn ich die wählen foo_barTabelle, klicken Sie auf die „Beziehung Ansicht“ -Link, und versuchen Sie die FK Spalten einstellen zu database.foo.idund database.bar.ides sagt „Nein Index definiert!“ neben jeder Spalte.

Was vermisse ich?

Klarstellung / Aktualisierung

Der Einfachheit halber möchte ich weiterhin phpMyAdmin verwenden. Ich verwende derzeit XAMPP, das einfach genug ist, um mich auf PHP / CSS / Javascript zu konzentrieren, und es wird mit phpMyAdmin geliefert.

Obwohl ich noch keine expliziten Fremdschlüssel einrichten konnte, habe ich eine relationale Tabelle und kann Verknüpfungen wie folgt ausführen:

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

Es ist mir nur unangenehm, die FKs nicht explizit in der Datenbank definiert zu haben.

Nathan Long
quelle

Antworten:

365

Wenn Sie phpMyAdmin zum Einrichten von Beziehungen verwenden möchten, müssen Sie zwei Dinge tun. Zunächst müssen Sie einen Index für die Fremdschlüsselspalte in der verweisenden Tabelle definieren (in Ihrem Fall also foo_bar.foo_id). Gehen Sie dann zur Beziehungsansicht (in der referenzierenden Tabelle) und wählen Sie die referenzierte Spalte (in Ihrem Fall foo.id) und die Aktionen zum Aktualisieren und Löschen aus.

Ich denke, Fremdschlüssel sind nützlich, wenn Sie mehrere Tabellen miteinander verknüpft haben. Insbesondere werden Ihre Löschskripte sehr kurz, wenn Sie die Referenzierungsoptionen richtig einstellen.

BEARBEITEN: Stellen Sie sicher, dass in beiden Tabellen die InnoDB-Engine ausgewählt ist.

rael_kid
quelle
93
Tipp: Beziehungsansicht ist ein kleiner Link unter Ihrem Tisch, es war schwer für mich, ihn überhaupt zu finden
Mladen Janjetovic
14
Es sei denn, dieser Link wird dort nicht angezeigt. In diesem Fall: Stellen Sie sicher, dass Ihre Tabelle vom Typ InnoDB ist (auf der Registerkarte Vorgänge in phpMyAdmin), damit dies nicht geschieht.
muttley91
4
@ muttley91Meine Tabelle ist InnoDB. Ich habe es noch einmal überprüft. Der Link wird immer noch nicht angezeigt.
Afilina
6
@afilina In der neuen Version von phpMyAdmin ist es oben in der Registerkarte "Struktur" direkt unter der Registerkartenzeile mit "Durchsuchen", "Struktur" usw. sichtbar.
Astitva Srivastava
225

Mit phpMyAdmin können Sie Fremdschlüssel mithilfe ihrer Ansicht "Beziehungen" definieren. Da MySQL jedoch nur Fremdbedingungen für "INNO DB" -Tabellen unterstützt, müssen Sie zunächst sicherstellen, dass die von Ihnen verwendeten Tabellen von diesem Typ sind.

Sie können Folgendes tun, um einen Fremdschlüssel so einzurichten, dass die PID-Spalte in einer Tabelle mit dem Namen CHILD auf die ID-Spalte in einer Tabelle mit dem Namen PARENT verweist:

  1. Wechseln Sie für beide Tabellen zur Registerkarte "Vorgänge" und ändern Sie ihren Typ in "INNO DB".
  2. Stellen Sie sicher, dass ID der Primärschlüssel (oder zumindest eine indizierte Spalte) der PARENT-Tabelle ist.
  3. Definieren Sie in der Tabelle CHILD einen Index für die Spalte PID.
  4. Klicken Sie beim Anzeigen der Registerkarte Struktur der Tabelle CHILD auf den Link "Beziehungsansicht" direkt über dem Abschnitt "Felder hinzufügen".
  5. Sie erhalten eine Tabelle, in der jede Zeile einer indizierten Spalte in Ihrer CLIENT-Tabelle entspricht. In der ersten Dropdown-Liste in jeder Zeile können Sie auswählen, auf welche TABELLE-> SPALTE die indizierten Spalten verweisen. Wählen Sie in der Zeile für PID PARENT-> ID aus der Dropdown-Liste und klicken Sie auf GO.

Wenn Sie die Tabelle CHILD exportieren, sollte angezeigt werden, dass für die PID-Spalte eine Fremdschlüsseleinschränkung erstellt wurde.

warte
quelle
2
Wow, sehr wichtig zu wissen. Diese Seite war nicht das erste, was ich fand, als ich nach Hilfe beim Hinzufügen eines Fremdschlüssels suchte. Ich wünschte, dies würde öfter erwähnt.
user1299656
86

Dies ist eine Zusammenfassung eines Wikipedia-Artikels. Es gibt die verschiedenen Arten von Beziehungen an, die Sie in PHPmyadmin festlegen können. Ich setze es hier ein, weil es für @ Nathans Kommentar zum Festlegen der Fremdschlüsseloptionen für "Beim Aktualisieren / Löschen" relevant ist, aber für einen Kommentar zu groß ist - hoffe, es hilft.

KASKADE

Immer wenn Zeilen in der Mastertabelle (referenziert) gelöscht (bzw. aktualisiert) werden, werden auch die entsprechenden Zeilen der untergeordneten Tabelle (referenziert) mit einer passenden Fremdschlüsselspalte gelöscht (bzw. aktualisiert). Dies wird als Kaskadenlöschung (bzw. Aktualisierung [2]) bezeichnet.

BESCHRÄNKEN

Ein Wert kann nicht aktualisiert oder gelöscht werden, wenn eine Zeile in einer Fremdschlüsseltabelle vorhanden ist, die auf den Wert in der referenzierten Tabelle verweist. Ebenso kann eine Zeile nicht gelöscht werden, solange ein Verweis darauf aus einer Fremdschlüsseltabelle vorhanden ist.

KEINE AKTION

NO ACTION und RESTRICT sind sich sehr ähnlich. Der Hauptunterschied zwischen NO ACTION und RESTRICT besteht darin, dass bei NO ACTION die Überprüfung der referenziellen Integrität durchgeführt wird, nachdem versucht wurde, die Tabelle zu ändern. RESTRICT führt die Prüfung durch, bevor versucht wird, die Anweisung UPDATE oder DELETE auszuführen. Beide referenziellen Aktionen verhalten sich gleich, wenn die referenzielle Integritätsprüfung fehlschlägt: Die Anweisung UPDATE oder DELETE führt zu einem Fehler.

SET NULL

Die Fremdschlüsselwerte in der referenzierenden Zeile werden auf NULL gesetzt, wenn die referenzierte Zeile aktualisiert oder gelöscht wird. Dies ist nur möglich, wenn die entsprechenden Spalten in der Referenzierungstabelle nullwertfähig sind. Aufgrund der Semantik von NULL erfordert eine referenzierende Zeile mit NULL in den Fremdschlüsselspalten keine referenzierte Zeile.

STANDARD EINSTELLEN

Ähnlich wie bei SET NULL werden die Fremdschlüsselwerte in der referenzierenden Zeile auf die Standardspalte gesetzt, wenn die referenzierte Zeile aktualisiert oder gelöscht wird.

Brett
quelle
1
Besser noch, gehen Sie direkt zur MySQL-Quelldokumentation: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser
62

In phpmyadmin können Sie Fremdschlüssel einfach über die GUI zuweisen. Klicken Sie auf die Tabelle und wechseln Sie zur Registerkarte Struktur. Die Beziehungsansicht finden Sie unten in der Tabelle (siehe Abbildung unten).

Geben Sie hier die Bildbeschreibung ein

Sie können den Schmiedeschlüssel aus dem Listenfeld neben dem Primärschlüssel zuweisen (siehe Abbildung unten). und speichern

Geben Sie hier die Bildbeschreibung ein

entsprechende SQL-Abfrage automatisch generiert und ausgeführt.

Nishad Up
quelle
16

Für diejenigen, die neu in der Datenbank sind ... und eine vorhandene Tabelle ändern müssen. Viele Dinge scheinen ziemlich einfach zu sein, aber es gibt immer etwas ... zwischen A und B.

Vor allem anderen, werfen Sie einen Blick auf diese .

  1. Stellen Sie sicher, dass Sie P_ID (übergeordnete ID in der übergeordneten und untergeordneten Tabelle) haben.
  2. Natürlich wird es bereits im Elternteil ausgefüllt. Nicht unbedingt im Kind auf wahre und endgültige Weise. So zum Beispiel P_ID # 3 (möglicherweise zeigt die untergeordnete Tabelle oft auf die ursprüngliche P_ID in der übergeordneten Tabelle).
  3. Gehen Sie zur Registerkarte SQL (ich verwende phpMyAdmin, sollte in anderen ähnlich sein) und führen Sie den folgenden Befehl aus:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Klicken Sie auf die untergeordnete Tabelle, dann auf die Struktur und schließlich auf die relationale Ansicht. Beenden Sie dort Ihre DB-Planung. Vor dieser gab es eine nette Antwort über Kaskade, Einschränkung usw. Natürlich könnte dies durch Befehle erfolgen ...

user2060451
quelle
9

Fremdschlüssel bedeutet, dass ein Nicht-Primat-Attribut einer Tabelle auf das Primat-Attribut eines anderen * in phpMyAdmin * verweist. Legen Sie zuerst die Spalte fest, in der Sie den Fremdschlüssel als Index festlegen möchten

Klicken Sie dann auf RELATION VIEW

Dort finden Sie die Optionen zum Festlegen des Fremdschlüssels

Shafeeq M kunjumoideen
quelle
7

Mit InnoDB können Sie einer Tabelle mithilfe von ALTER TABLE eine neue Fremdschlüsseleinschränkung hinzufügen:

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]

Wenn MyISAM in Ihrem Kontext Vorteile gegenüber InnoDB bietet, warum sollten Sie dann überhaupt Fremdschlüsseleinschränkungen erstellen? Sie können dies auf Modellebene Ihrer Anwendung behandeln. Stellen Sie einfach sicher, dass die Spalten, die Sie als Fremdschlüssel verwenden möchten, indiziert sind!

Markus
quelle
4
Fremdschlüsseleinschränkungen ersparen mir viel Aufwand und mögliche Fehler. Angenommen, ich werde einen Benutzer von meinem System löschen. Ich könnte Code schreiben, der jeden Ort in der Datenbank angibt, an dem Daten über diesen Benutzer vorhanden sind, und ihn anweisen, sie zu löschen. Aber ich muss diese Löschfunktion immer auf dem neuesten Stand halten. Wenn andererseits alle benutzerbezogenen Daten eine FK für die Benutzer-ID haben und beim Löschen auf Kaskade eingestellt sind, muss mein Code nur "Diesen Benutzer löschen" lauten, und die Datenbank kümmert sich um das Löschen aller Daten eine FK-Referenz auf diesen Benutzer. Viel sauberer zu pflegen.
Nathan Long
1
@ Nathan: Das sage ich in der Post. Sie können dies auch auf Modellebene handhaben. Sie können beim Löschen eine Kaskade aus dem Modell implementieren.
Markus
3
Sie fügen Ihren Datenbanktabellen fast immer referenzielle Integrität hinzu. Die Datenbank sollte sich vor schlechter Anwendungsprogrammierung schützen. Verlassen Sie sich nicht nur auf Ihre Anwendung, um die Datenintegrität zu gewährleisten. Natürlich gibt es immer Ausnahmen zu jeder Regel, aber ich habe keine dafür gefunden.
Harv
4

Vergessen Sie nicht, dass die beiden Spalten denselben Datentyp haben sollten.

Wenn beispielsweise eine Spalte vom Typ INT und die andere vom Typ tinyint ist, wird der folgende Fehler angezeigt:

Fehler beim Erstellen des Fremdschlüssels in [PID-Spalte] (Datentypen prüfen)

pouya
quelle
3

Schritt 1: Sie müssen die Zeile: default-storage-engine = InnoDB im Abschnitt [mysqld] Ihrer mysql-Konfigurationsdatei (my.cnf oder my.ini, abhängig von Ihrem Betriebssystem) hinzufügen und den mysqld-Dienst neu starten. Geben Sie hier die Bildbeschreibung ein

Schritt 2: Wenn Sie nun die Tabelle erstellen, sehen Sie den Tabellentyp: InnoDB

Geben Sie hier die Bildbeschreibung ein

Schritt 3: Erstellen Sie sowohl die übergeordnete als auch die untergeordnete Tabelle. Öffnen Sie nun die untergeordnete Tabelle und wählen Sie die Spalte U aus, die den Fremdschlüssel haben soll: Wählen Sie den Indexschlüssel aus der Aktionsbezeichnung aus, wie unten gezeigt.

Geben Sie hier die Bildbeschreibung ein

Schritt 4: Öffnen Sie nun die Beziehungsansicht in derselben untergeordneten Tabelle von unten in der Nähe der Druckansicht, wie unten gezeigt.

Geben Sie hier die Bildbeschreibung ein Schritt 5: Wählen Sie die Spalte U aus, in der der Fremdschlüssel angezeigt werden soll. Wählen Sie die übergeordnete Spalte aus der Dropdown-Liste aus. dbName.TableName.ColumnName

Wählen Sie die entsprechenden Werte für ON DELETE und ON UPDATE Geben Sie hier die Bildbeschreibung ein

Vinod
quelle
2

Stellen Sie zuerst die Storage Engine als InnoDB ein

Stellen Sie zuerst die Storage Engine als InnoDB ein

dann die Option Beziehungsansicht im Strukturmenü aktivieren

dann aktivieren Sie die Option Beziehungsansicht

Sahil Ralkar
quelle
Ihr erster Schritt ist korrekt, aber was ist mit dem nächsten? Bitte schreiben Sie den gesamten Prozess Schritt für Schritt.
Kunal Shaktawat
2

Dies ist ein alter Thread, aber antworte, wenn er für irgendjemanden nützlich ist.

Schritt 1 . Ihre Db Storage Engine ist auf InnoDB eingestellt

Schritt 2 . Primärtabelle erstellen

Hier customerist die Primärtabelle und der customer_idPrimärschlüssel

Geben Sie hier die Bildbeschreibung ein

Schritt 3 . Erstellen Sie eine Fremdschlüsseltabelle und geben Sie einen Index an

hier haben wir customer_addressesals verwandte Tabelle und speichern Kundenadressen, also hier customer_idBeziehung zur customerTabelle

Wir können den Index direkt auswählen, wenn wir eine Tabelle erstellen (siehe unten)

Geben Sie hier die Bildbeschreibung ein

Wenn Sie beim Erstellen einer Tabelle vergessen haben, einen Index anzugeben , können Sie den Index auf der Registerkarte Struktur der Tabelle wie folgt angeben.

Geben Sie hier die Bildbeschreibung ein

Schritt 4 . Sobald Sie dem Feld einen Index gegeben haben, gehen Sie zur Registerkarte Struktur und klicken Sie auf Beziehungsansicht, wie im Bild unten gezeigt

Geben Sie hier die Bildbeschreibung ein

Schritt 5 . Wählen Sie nun ON DELETE und ON UPDATE aus, was Sie tun möchten. Wählen Sie eine Spalte aus der aktuellen Tabelle aus, wählen Sie DB (SAME DB) aus, wählen Sie die Beziehungstabelle und den Primärschlüssel aus dieser Tabelle aus, wie im folgenden Bild gezeigt, und speichern Sie sie

Geben Sie hier die Bildbeschreibung ein

Überprüfen Sie nun, ob die Beziehung erfolgreich angegeben wurde, gehen Sie zur Liste der fremden Tabellendaten und klicken Sie auf den Fremdschlüsselwert. Sie werden zum primären Tabellendatensatz umgeleitet und die Beziehung erfolgreich hergestellt.

Devsi Odedra
quelle
0

Aus der offiziellen MySQL-Dokumentation unter https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :

MySQL erfordert Indizes für Fremdschlüssel und Schlüssel, auf die verwiesen wird, damit Fremdschlüsselprüfungen schnell durchgeführt werden können und kein Tabellenscan erforderlich ist.

Jaime Montoya
quelle
0

Neuere Versionen von phpMyAdmin verfügen nicht mehr über die Option " Beziehungsansicht ". In diesem Fall müssen Sie eine Anweisung ausführen, um dasselbe zu erreichen. Zum Beispiel

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Wenn in diesem Beispiel eine Zeile aus Unternehmen gelöscht wird, werden auch alle Mitarbeiter mit dieser Unternehmens-ID gelöscht.

Vincent
quelle