Lösung des Problems mit Mehreren Fremdschlüsseln
in MySQL: Eine Schritt-für-Schritt-Anleitung
Bei der Arbeit mit Datenbanken, insbesondere in MySQL, können Szenarien auftreten, in denen Sie mehrere Fremdschlüssel implementieren müssen, die auf dieselbe übergeordnete Tabelle verweisen. Dies kann besonders herausfordernd sein, wie das Problem zeigt, mit dem viele Benutzer konfrontiert sind, wie zum Beispiel die Zuordnung verschiedener Lieferanten innerhalb einer Tabelle für Versandinformationen. In diesem Beitrag werden wir eine häufige Frage zu mehreren Fremdschlüsseln untersuchen, eine strukturierte Lösung mit Best Practices bereitstellen und Sie durch den Fehlerbehebungsprozess führen.
Das Problem
Stellen Sie sich vor, Sie haben eine Tabelle VERSAND_DETAILS
, die sowohl für die Nachverfolgung der Versanddienstleister (wie FedEx oder UPS) als auch der Produktabwicklungsdienstleister (denken Sie an Dunder Mifflin) verantwortlich ist. In dieser Situation müssen mehrere Spalten in den Versanddetails auf dieselbe übergeordnete Tabelle, LIEFERANT
, verweisen. Probleme können auftreten, wenn Sie versuchen, Fremdschlüsselbeschränkungen für diese Spalten zu erstellen, wie zum Beispiel, dass Sie keine mehreren Fremdschlüssel definieren können.
Benutzer erleben häufig Fehler wie den folgenden:
Kann Tabelle './<DB_NAME>/VERSAND_GRID.frm' nicht erstellen (errno: 150)
Dieser Fehler weist typischerweise auf ein Problem mit der Definition des Fremdschlüssels oder den beteiligten Datentypen hin.
Übersicht der Lösung
Um das Problem der Definition mehrerer Fremdschlüssel in MySQL zu lösen, befolgen Sie diese Schritte:
-
Tabellenstruktur richtig definieren: Stellen Sie sicher, dass Ihre Tabelle
LIEFERANT
einen einzigartigen Primärschlüssel hat, der mit den Fremdschlüsselspalten in Ihrer TabelleVERSAND_DETAILS
kompatibel ist. -
Tabellentyp korrigieren: Stellen Sie sicher, dass beide Tabellen (
LIEFERANT
undVERSAND_GRID
) vom TypInnoDB
sind. Dies ist entscheidend, da Fremdschlüsselbeschränkungen in anderen Speicher-Engines wie MyISAM nicht unterstützt werden. -
Kompatibilität der Datentypen sicherstellen: Überprüfen Sie, dass die Datentypen der Fremdschlüssel mit dem Datentyp des Primärschlüssels, auf den sie verweisen, übereinstimmen. Wenn beispielsweise
LIEFERANT.no
alsINT(6)
definiert ist, müssen alle Fremdschlüsselreferenzen ebenfalls vom selben Typ sein. -
Doppelte Primärschlüsseldefinitionen vermeiden: Stellen Sie sicher, dass Ihre SQL-Anweisung nicht versehentlich mehrere Definitionen des Primärschlüssels enthält. Dies kann zu Fehlern bei der Tabellenerstellung führen.
Beispielcode
Hier ist ein korrigiertes Beispiel, wie Ihre Tabelle VERSAND_GRID
korrekt definiert werden kann, nachdem die oben genannten Punkte berücksichtigt wurden:
CREATE TABLE VERSAND_GRID(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Eindeutige ID für jede Zeile',
versand_lieferant_no INT(6) NOT NULL COMMENT 'Fremdschlüssel zu LIEFERANT.no für den Versandlieferanten (vendors_type muss 3 sein)',
start_lieferant_no INT(6) NOT NULL COMMENT 'Fremdschlüssel zu LIEFERANT.no für den Lieferanten, von dem versendet wird',
end_lieferant_no INT(6) NOT NULL COMMENT 'Fremdschlüssel zu LIEFERANT.no für den Lieferanten, zu dem versendet wird',
versand_dauer INT(1) DEFAULT 1 COMMENT 'Dauer in vollen Tagen, die der Versand benötigen wird',
preis FLOAT(5,5) NOT NULL COMMENT 'Preis in US-Dollar pro Versand-Pfund (bis zu 5 Dezimalstellen)',
is_flat_rate TINYINT(1) DEFAULT 0 COMMENT '1, wenn es eine Pauschale unabhängig vom Gewicht ist, 0, wenn der Preis nach Pfund berechnet wird',
INDEX (versand_lieferant_no),
INDEX (start_lieferant_no),
INDEX (end_lieferant_no),
FOREIGN KEY (versand_lieferant_no) REFERENCES LIEFERANT (no),
FOREIGN KEY (start_lieferant_no) REFERENCES LIEFERANT (no),
FOREIGN KEY (end_lieferant_no) REFERENCES LIEFERANT (no)
) ENGINE=InnoDB;
Wichtige Erkenntnisse
- Datentypen sind wichtig: Stellen Sie immer sicher, dass die Fremdschlüsselspalten mit dem Datentyp des referenzierten Primärschlüssels übereinstimmen.
- Verwenden Sie InnoDB: Wenn Sie Fremdschlüssel über Tabellen hinweg einrichten, ist die Verwendung der
InnoDB
-Engine unerlässlich. - Doppelte Definitionen vermeiden: Wenn Sie feststellen, dass Ihr SQL Fehler ausgibt, überprüfen Sie doppelte Definitionen oder Syntaxprobleme.
Indem Sie diese Richtlinien befolgen, können Sie effektiv Ihre Tabelle mit mehreren Fremdschlüsseln erstellen und häufige Fallstricke im Zusammenhang mit Fremdschlüsselbeschränkungen vermeiden. Viel Erfolg bei Ihren MySQL-Vorhaben und viel Spaß beim Programmieren!