Frage

Ich gründe eine Datenbank mit phpMyAdmin auf. Ich habe zwei Tabellen (foo und bar), auf ihre Primärschlüssel indiziert . Ich versuche, eine relationale Tabelle (foo_bar) zwischen ihnen zu schaffen, deren Primärschlüssel als Fremdschlüssel verwendet wird.

habe ich diese Tabellen als MyISAM, aber da alle drei zu InnoDB geändert haben, weil ich gelesen, dass MyISAM keine Fremdschlüssel nicht unterstützt. Alle id Felder sind INT(11).

Wenn ich die foo_bar Tabelle wählen, klicken Sie auf die „Beziehung Ansicht“ -Link, und versuchen Sie die FK Spalten zu setzen database.foo.id und database.bar.id werden, heißt es „Kein Index definiert!“ neben jeder Spalte.

Was bin ich fehlt?

Klarstellung / Update

Aus Gründen der Einfachheit, möchte ich mit phpMyAdmin halten. Ich bin derzeit mit XAMPP, die einfach genug ist, mich auf der PHP / CSS / Javascript lassen konzentrieren, und es kommt mit phpMyAdmin.

Auch, obwohl ich nicht in der Lage gewesen, noch expliziten Fremdschlüssel einzurichten, ich habe eine relationale Tabelle und schließt sich wie folgt 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 macht einfach unangenehm mich nicht den FKs hat explizit in der Datenbank definiert ist.

War es hilfreich?

Lösung

Wenn Sie verwenden phpMyAdmin wollen Beziehungen einzurichten, müssen Sie 2 Dinge tun. Zunächst einmal müssen Sie einen Index für die Fremdschlüsselspalte in der verweisenden Tabelle definieren (so foo_bar.foo_id, in Ihrem Fall). Dann gehen Sie zu Beziehung Ansicht (in der verweisenden Tabelle) und wählen Sie die genannten Spalt (also in Ihrem Fall foo.id) und die auf Aktualisierung und Löschaktionen.

Ich denke, Fremdschlüssel nützlich sind, wenn Sie zu einem anderen, insbesondere verknüpft mehrere Tabellen haben, Ihre Lösch Skripte sehr kurz werden, wenn Sie die Referenzierung Optionen richtig eingestellt ist.

EDIT:. Stellen Sie sicher, dass beide Tabellen die InnoDB-Engine haben ausgewählt

Andere Tipps

phpMyAdmin können Sie Fremdschlüssel definieren ihre „Beziehungen“-Ansicht. Da aber nur MySQL Fremd Einschränkungen für „INNO DB“ Tabellen unterstützt, ist der erste Schritt, um sicherzustellen, dass die Tabellen, die Sie verwenden, sind von dieser Art.

So richten Sie ein Fremdschlüssel, so dass die PID-Spalte in einem Kind namens Tabelle verweist auf die ID-Spalte in einer Tabelle mit dem Namen ELTERN, Sie folgendes tun:

  1. Für beide Tabellen, auf die Registerkarte Vorgänge gehen und ihre Art ändern „INNO DB“
  2. Stellen Sie sicher, ID ist der Primärschlüssel (oder zumindest eine indexierte Spalte) der übergeordneten Tabelle.
  3. In der untergeordneten Tabelle, einen Index für die PID-Spalte definieren.
  4. Während der Registerkarte Struktur der untergeordneten Tabelle sehen, klicken Sie auf die „Beziehung Ansicht“ Link über die „Felder hinzufügen“ Abschnitt.
  5. Sie werden eine Tabelle angegeben werden, wobei jede Zeile auf eine indizierte Spalte in der Client-Tabelle entspricht. Die erste Auswahl in jeder Zeile können Sie, welche Tabellen-> Spalte die indexierte Spalte Referenzen wählen. In der Zeile für PID, wählen Eltern-> ID aus der Drop-Down-und klicken Sie auf GO.

Durch einen Export auf dem Kind Tisch tun, sollten Sie einen Fremdschlüssel sehen ist für die PID-Spalte erstellt wurde.

Dies ist eine Zusammenfassung eines Wikipedia-Artikel. Es gibt die verschiedenen Arten von Beziehungen, die Sie in phpMyAdmin festlegen können. Ich stelle es hier, weil es zu @ Nathans Kommentar zur Einstellung der Fremdschlüssel Optionen für relevant ist „auf update / delete“, aber zu groß für einen Kommentar -. Hoffe, es hilft

CASCADE

Jedes Mal, wenn Zeilen in dem Master (referenziert) Tabelle gelöscht (resp. Aktualisiert), die jeweiligen Reihen des Kindes (Referenzierung) Tabelle mit einem passenden Fremdschlüsselspalt (bzw. aktualisiert.) Erhalten gelöscht wird auch. Dies wird eine Kaskade löschen genannt (resp. Aktualisieren [2]).

telle

Ein Wert kann nicht aktualisiert oder gelöscht werden, wenn eine Zeile in einer Fremdschlüsseltabelle vorhanden ist, die den Wert in der referenzierten Tabelle verweist. In ähnlicher Weise kann eine Zeile nicht so lange gelöscht werden, da es eine Referenz von einer Fremdschlüssel-Tabelle ist.

NO ACTION

NO ACTION und RESTRICT sind sehr ähnlich. Der wesentliche Unterschied zwischen NO ACTION und RESTRICT ist, dass keine Aktion die Referenzintegritätsprüfung nach dem Versuch gemacht wird, um die Tabelle zu ändern. Schränkt die Prüfung, bevor Sie die Update- oder DELETE-Anweisung auszuführen. Beide Referenz Aktionen wirken die gleiche, wenn die Referenzintegritätsprüfung fehlschlägt: UPDATE oder DELETE-Anweisung wird in einem Fehler

.

SET NULL

Die Fremdschlüsselwerte in der verweisenden 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 verweisenden Tabelle NULL festlegbare sind. Aufgrund der Semantik von NULL, wird eine Referenzierung Zeile mit NULL-Werte in den Fremdschlüsselspalten nicht referenzierte Zeile erforderlich ist.

SET DEFAULT

ähnliche NULL, die Fremdschlüsselwerte in der verweisenden Zeile SET auf die Säule Standard festgelegt, wenn die referenzierte Zeile aktualisiert oder gelöscht wird.

In phpMyAdmin können Sie Fremdschlüssel zuweisen einfach durch seine GUI. Klicken Sie auf den Tisch und gehen Sie zu Registerkarte Struktur. finden Sie die Ansicht von Beziehungen auf nur unten von Tabelle (in Bild unten dargestellt).

 image description hier

Sie können die Schmiedeschlüssel aus dem Listenfeld in der Nähe des Primärschlüssels zugeordnet werden. (Siehe Bild unten). und speichern

 image description hier

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

Für diejenigen, die Datenbank .... und brauchen eine vorhandene Tabelle zu ändern. Eine Menge Dinge scheinen ziemlich einfach zu sein, aber es gibt immer etwas ... zwischen A und B

Vor allem anderen, werfen Sie einen Blick auf dieser .

  1. Stellen Sie sicher, dass Sie P_ID (Eltern-ID auf Eltern und Kind-Tabelle) haben.
  2. Natürlich wird es bereits in der Mutter gefüllt werden. Nicht unbedingt in dem Kind in einer wahren und endgültigen Weise. So zum Beispiel P_ID # 3 (vielleicht viele Male in der untergeordneten Tabelle wird auf Original P_ID bei übergeordneter Tabelle werden zeigen).
  3. Zum SQL-Register (Ich bin mit phpMyAdmin, sollte in anderen sehr ähnlich sein) und tun Sie diesen Befehl:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
    
  4. Klicken Sie auf Kindertisch, als Struktur, schließlich auf relationale Sicht. Beenden Sie Ihre DB Planung gibt. Es gab eine schöne Antwort, bevor diese über Kaskade, beschränken usw. Natürlich könnte es durch Befehle durchgeführt werden ...

Fremdschlüssel bedeutet ein nicht prime Attribut einer Tabelle referes das Prime-Attribut eines anderen * in phpMyAdmin * zuerst die Spalte, die Sie Fremdschlüssel als Index

gesetzt werden soll

klicken Sie dann auf BEZUG VIEW

Es kann u die Optionen finden Fremdschlüssel setzen

InnoDB ermöglicht es Ihnen, eine neue Fremdschlüssel zu einer Tabelle hinzufügen, indem Sie mit 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]

Auf der anderen Seite, wenn MyISAM Vorteile gegenüber InnoDB in Ihrem Kontext hat, warum sollte man überhaupt für Fremdschlüssel zu erstellen. Sie können dies auf der Modellebene Ihrer Anwendung behandeln. So stellen Sie sicher, dass die Spalten, die Sie verwenden möchten, als Fremdschlüssel indiziert werden!

Vergessen Sie nicht, dass die beiden Spalten den gleichen Datentyp haben.

zum Beispiel, wenn eine Spalte vom Typ INT und die andere sind vom Typ tinyint Sie die folgende Fehlermeldung erhalten werden:

Fehler Fremdschlüssel auf [PID Spalte] (überprüfen Datentypen)

Erstellen

Schritt 1: Sie haben die Zeile hinzufügen: default-storage-engine = InnoDB unter dem Abschnitt [mysqld] Ihre MySQL-Konfigurationsdatei (my.cnf oder my.ini je nach Betriebssystem) und den mysqld-Dienst neu starten. eingeben Bild Beschreibung hier

Schritt 2: Nun, wenn Sie die Tabelle erstellen können Sie die Art der Tabelle sehen ist: InnoDB

Schritt 3: Erstellen Sie beide Eltern-Kind-Tabelle. Öffnen Sie nun die Child-Tabelle und wählen Sie die Spalte U mag die Fremdschlüssel haben: Wählen Sie den Index Key aus Action-Etikett, wie unten gezeigt.

Schritt 4: Jetzt die Beziehung öffnen Ansicht in der gleichen Kind Tabelle von unten in der Nähe des Druckansicht wie unten dargestellt.

Schritt 5: Wählen Sie die Spalte U mag den Fremdschlüssel als Select hat die Parent-Spalte aus der Dropdown. dbName.TableName.ColumnName

Wählen Sie die entsprechenden Werte für ON DELETE und ON UPDATE eingeben Bild Beschreibung hier

Von 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 referenzierten Schlüssel, so dass   Fremdschlüsselprüfungen können schnell sein und nicht einen Tabellenscan erforderlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top