Ich richte eine Datenbank mit phpMyAdmin ein. Ich habe zwei Tabellen ( foo
und 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 id
Felder sind INT(11)
.
Wenn ich die wählen foo_bar
Tabelle, klicken Sie auf die „Beziehung Ansicht“ -Link, und versuchen Sie die FK Spalten einstellen zu database.foo.id
und database.bar.id
es 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.
quelle
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:
Wenn Sie die Tabelle CHILD exportieren, sollte angezeigt werden, dass für die PID-Spalte eine Fremdschlüsseleinschränkung erstellt wurde.
quelle
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.
quelle
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).
Sie können den Schmiedeschlüssel aus dem Listenfeld neben dem Primärschlüssel zuweisen (siehe Abbildung unten). und speichern
entsprechende SQL-Abfrage automatisch generiert und ausgeführt.
quelle
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 .
Gehen Sie zur Registerkarte SQL (ich verwende phpMyAdmin, sollte in anderen ähnlich sein) und führen Sie den folgenden Befehl aus:
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 ...
quelle
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
quelle
Mit InnoDB können Sie einer Tabelle mithilfe von ALTER TABLE eine neue Fremdschlüsseleinschränkung hinzufügen:
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!
quelle
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)
quelle
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.
Schritt 2: Wenn Sie nun die Tabelle erstellen, sehen Sie den Tabellentyp: InnoDB
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.
Schritt 4: Öffnen Sie nun die Beziehungsansicht in derselben untergeordneten Tabelle von unten in der Nähe der Druckansicht, wie unten gezeigt.
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
quelle
Stellen Sie zuerst die Storage Engine als InnoDB ein
dann die Option Beziehungsansicht im Strukturmenü aktivieren
quelle
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
customer
ist die Primärtabelle und dercustomer_id
PrimärschlüsselSchritt 3 . Erstellen Sie eine Fremdschlüsseltabelle und geben Sie einen Index an
hier haben wir
customer_addresses
als verwandte Tabelle und speichern Kundenadressen, also hiercustomer_id
Beziehung zurcustomer
TabelleWir können den Index direkt auswählen, wenn wir eine Tabelle erstellen (siehe unten)
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.
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
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
Ü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.
quelle
Aus der offiziellen MySQL-Dokumentation unter https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html :
quelle
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
Wenn in diesem Beispiel eine Zeile aus Unternehmen gelöscht wird, werden auch alle Mitarbeiter mit dieser Unternehmens-ID gelöscht.
quelle