353 Stimmen

Fremdschlüssel in phpMyAdmin einrichten?

Ich bin dabei, eine Datenbank mit phpMyAdmin einzurichten. Ich habe zwei Tabellen ( foo y bar ), indiziert auf ihre Primärschlüssel . Ich versuche, eine relationale Tabelle zu erstellen ( foo_bar ) zwischen ihnen, wobei ihre Primärschlüssel als Fremdschlüssel verwendet werden.

Ich habe diese Tabellen als MyISAM-Tabellen erstellt, habe aber inzwischen alle drei auf InnoDB umgestellt, weil ich gelesen habe, dass MyISAM keine Fremdschlüssel unterstützt. Alle id Felder sind INT(11) .

Wenn ich die foo_bar Tabelle, klicken Sie auf den Link "Beziehungsansicht", und versuchen Sie, die FK-Spalten so einzustellen, dass sie database.foo.id y database.bar.id heißt es "Kein Index definiert!" neben jeder Spalte.

Was übersehe ich?

Klärung/Aktualisierung

Der Einfachheit halber möchte ich weiterhin phpMyAdmin verwenden. Ich benutze derzeit XAMPP, das einfach genug ist, damit ich mich auf PHP/CSS/Javascript konzentrieren kann, und es kommt mit phpMyAdmin.

Auch wenn ich noch keine expliziten Fremdschlüssel einrichten konnte, habe ich eine relationale Tabelle und kann solche Verknüpfungen durchfü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 einfach unangenehm, dass die FKs nicht explizit in der Datenbank definiert sind.

380voto

rael_kid Punkte 11140

Wenn Sie phpMyAdmin verwenden möchten, um Beziehungen einzurichten, müssen Sie 2 Dinge tun. Zunächst müssen Sie einen Index auf die Fremdschlüsselspalte in der verweisenden Tabelle definieren (in Ihrem Fall also foo_bar.foo_id). Dann gehen Sie in die Beziehungsansicht (in der Bezugstabelle) und wählen die Bezugsspalte (in Ihrem Fall foo.id) und die Aktionen on update und on delete 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.

EDIT: Stellen Sie sicher, dass für beide Tabellen die InnoDB-Engine ausgewählt ist.

232voto

awais Punkte 2321

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

Um einen Fremdschlüssel so einzurichten, dass die PID-Spalte in einer Tabelle namens CHILD auf die ID-Spalte in einer Tabelle namens PARENT verweist, können Sie wie folgt vorgehen:

  1. Gehen Sie für beide Tabellen auf die Registerkarte "Operationen" und ändern Sie ihren Typ in "INNO DB"
  2. Stellen Sie sicher, dass ID der Primärschlüssel (oder zumindest eine indizierte Spalte) der Tabelle PARENT ist.
  3. Definieren Sie in der Tabelle CHILD einen Index für die Spalte PID.
  4. Klicken Sie auf 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 jeder Zeile können Sie wählen, auf welche TABLE->COLUMN die indizierte Spalte verweist. In der Zeile für PID wählen Sie PARENT->ID aus dem Dropdown-Menü und klicken auf GO.

Wenn Sie einen Export der Tabelle CHILD durchführen, sollten Sie sehen, dass eine Fremdschlüssel-Beschränkung für die Spalte PID erstellt wurde.

93voto

Brett Punkte 3166

Dies ist eine Zusammenfassung eines Wikipedia-Artikels. Er beschreibt die verschiedenen Arten von Beziehungen, die Sie in PHPmyadmin festlegen können. Ich stelle ihn hier ein, weil er für den Kommentar von @Nathan über die Einstellung der Fremdschlüsseloptionen für "on update/delete" relevant ist, aber zu umfangreich für einen Kommentar ist - ich hoffe, er hilft.

CASCADE

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

RESTRICT

Ein Wert kann nicht aktualisiert oder gelöscht werden, wenn eine Zeile in einer Fremdschlüsseltabelle existiert, die auf den Wert in der referenzierten Tabelle verweist. Ebenso kann eine Zeile nicht gelöscht werden, solange ein Verweis auf sie in 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 Prüfung der referentiellen Integrität nach dem Versuch, die Tabelle zu ändern, durchgeführt wird. RESTRICT führt die Prüfung durch, bevor die UPDATE- oder DELETE-Anweisung ausgeführt wird. Beide referentiellen Aktionen verhalten sich gleich, wenn die Prüfung der referentiellen Integrität fehlschlägt: Die UPDATE- oder DELETE-Anweisung 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 referenzierenden Tabelle nullbar sind. Aufgrund der Semantik von NULL benötigt eine referenzierende Zeile mit NULLs in den Fremdschlüsselspalten keine referenzierte Zeile.

EINSTELLUNG DEFAULT

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

74voto

Nishad Up Punkte 3021

In phpmyadmin können Sie den Fremdschlüssel einfach über die GUI zuweisen. Klicken Sie auf die Tabelle und gehen Sie auf die Registerkarte "Struktur". Sie finden die Ansicht "Relation" direkt unterhalb der Tabelle (siehe Abbildung unten).

enter image description here

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

enter image description here

Die entsprechende SQL-Abfrage wird automatisch erstellt und ausgeführt.

21voto

user2060451 Punkte 2426

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

Werfen Sie vor allen anderen Dingen einen Blick auf este .

  1. Vergewissern Sie sich, dass Sie die P_ID (übergeordnete ID sowohl in der übergeordneten als auch in der untergeordneten Tabelle) haben.

  2. Natürlich wird sie bereits im Elternteil ausgefüllt sein. Nicht notwendigerweise im Kind in einer echten und endgültigen Weise. So verweist zum Beispiel P_ID #3 (vielleicht viele Male in der Child-Tabelle auf die ursprüngliche P_ID in der Parent-Tabelle).

  3. Gehen Sie auf die Registerkarte SQL (ich verwende phpMyAdmin, bei anderen sollte es ähnlich sein) und führen Sie diesen Befehl aus:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X