it-swarm.com.de

Fremdschlüssel in phpMyAdmin einrichten?

Ich richte eine Datenbank mit phpMyAdmin ein. Ich habe zwei Tabellen (foo und bar), indiziert für ihre Primärschlüssel. Ich versuche, eine relationale Tabelle (foo_bar) zwischen ihnen zu erstellen, deren 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 foo_bar-Tabelle auswähle, klicken Sie auf den Link "Beziehungsansicht", und versuchen Sie, die FK-Spalten auf database.foo.id und database.bar.id einzustellen. Es heißt "Kein Index definiert!" neben jeder Spalte.

Was vermisse ich?

Klarstellung/Update

Der Einfachheit halber möchte ich phpMyAdmin weiter verwenden. Ich verwende derzeit XAMPP, was leicht genug ist, um mich auf PHP/CSS/Javascript zu konzentrieren, und es kommt mit phpMyAdmin.

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 einfach unangenehm, die FKs nicht explizit in der Datenbank zu definieren.

304
Nathan Long

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 referenzierenden 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) sowie die Aktionen on update und on.

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

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

334
rael_kid

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

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, haben Sie folgende Möglichkeiten:

  1. Wechseln Sie für beide Tabellen auf die Registerkarte Operations und ändern Sie ihren Typ in "INNO DB".
  2. Stellen Sie sicher, dass ID der Primärschlüssel (oder mindestens eine indizierte Spalte) der Tabelle PARENT ist.
  3. Definieren Sie in der Tabelle CHILD einen Index für die PID-Spalte.
  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 auswählen, auf welche Tabelle -> Spalte die indizierte Spalte verweist. Wählen Sie in der Zeile für PID aus der Dropdown-Liste PARENT-> ID aus und klicken Sie auf GO.

Beim Exportieren der Tabelle CHILD sollte eine Fremdschlüsseleinschränkung für die PID-Spalte erstellt worden sein.

215
awais

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

KASKADE

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

EINSCHRÄ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 von einer Fremdschlüsseltabelle auf sie Bezug genommen wird.

KEINE AKTION

KEINE AKTION und BESCHRÄNKUNG sind sich sehr ähnlich. Der Hauptunterschied zwischen NO ACTION und RESTRICT besteht darin, dass mit NO ACTION die Prüfung der referentiellen Integrität durchgeführt wird, nachdem versucht wurde, die Tabelle zu ändern. RESTRICT führt die Prüfung durch, bevor versucht wird, die UPDATE- oder DELETE-Anweisung auszuführen. Beide referentiellen Aktionen verhalten sich gleich, wenn die referenzielle Integritätsprüfung fehlschlägt: Die Anweisungen UPDATE oder DELETE führen 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 nullfähig sind. Aufgrund der Semantik von NULL erfordert eine referenzierende Zeile mit NULL in den Fremdschlüsselspalten keine referenzierte Zeile.

SET 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.

76
Brett

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

 enter image description here

Sie können den Fälschungsschlüssel aus dem Listenfeld in der Nähe des Primärschlüssels zuweisen (siehe Abbildung unten). und speichern

 enter image description here

die entsprechende SQL-Abfrage wird automatisch generiert und ausgeführt.

51
Nishad Up

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

Schauen Sie sich vor allem noch this an. 

  1. Stellen Sie sicher, dass Sie über eine P_ID verfügen (übergeordnete ID in der übergeordneten und untergeordneten Tabelle).
  2. Natürlich wird es im Elternteil bereits ausgefüllt. Nicht unbedingt beim Kind in wahrer und endgültiger Weise. So zum Beispiel P_ID # 3 (möglicherweise wird in der untergeordneten Tabelle oft auf die ursprüngliche P_ID der übergeordneten Tabelle verwiesen). 
  3. Gehen Sie zur Registerkarte SQL (Ich verwende phpMyAdmin, sollte in anderen ä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 Ihre DB-Planung dort. Vor dieser gab es eine nette Antwort über Kaskade, Einschränkung usw. Natürlich kann dies durch Befehle ...

13
user2060451

Fremdschlüssel bedeutet, dass ein Nicht-Primattribut einer Tabelle auf das Primattribut eines anderen * In phpMyAdmin * verweist. Legen Sie zunächst die Spalte fest, die Sie als Index festlegen möchten 

klicken Sie dann auf RELATION VIEW

dort finden Sie die Optionen zum Festlegen des Fremdschlüssels

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

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 jedoch Vorteile gegenüber InnoDB bietet, warum sollten Sie überhaupt Fremdschlüsseleinschränkungen erstellen wollen. Sie können dies auf der Modellebene Ihrer Anwendung erledigen. Stellen Sie nur sicher, dass die Spalten, die Sie als Fremdschlüssel verwenden möchten, indiziert sind!

7
markus

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

wenn zum Beispiel eine Spalte vom Typ INT ist und die andere vom Typ tinyint ist, wird der folgende Fehler angezeigt:

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

4
pouya

Schritt 1: Sie müssen die Zeile hinzufügen: Default-storage-engine = InnoDB Im Abschnitt [mysqld] Ihrer mysql-Konfigurationsdatei (my.cnf oder my.ini je nach Betriebssystem) und starten Sie den mysqld-Dienst neu .  enter image description here

Schritt 2: .__ Wenn Sie nun die Tabelle erstellen, sehen Sie, dass die Art der Tabelle lautet: InnoDB

 enter image description here

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, um den Fremdschlüssel zu erhalten: Wählen Sie den Indexschlüssel aus der Aktionsbezeichnung (siehe unten).

 enter image description here

Schritt 4: Öffnen Sie nun die Beziehungsansicht in derselben untergeordneten Tabelle in der Nähe der Druckansicht (siehe unten).

 enter image description here Schritt 5: Wählen Sie die Spalte aus, in der der Fremdschlüssel angezeigt werden soll. Wählen Sie die übergeordnete Spalte aus der Dropdownliste aus DbName.TableName.ColumnName

Wählen Sie geeignete Werte für ON DELETE und ON UPDATE  enter image description here

2
Vinod

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

MySQL erfordert Indizes zu Fremdschlüsseln und referenzierten Schlüsseln, damit Fremdschlüsselüberprüfungen können schnell sein und erfordern keinen Tabellenscan.

0
Jaime Montoya