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:

  1. Tabellenstruktur richtig definieren: Stellen Sie sicher, dass Ihre Tabelle LIEFERANT einen einzigartigen Primärschlüssel hat, der mit den Fremdschlüsselspalten in Ihrer Tabelle VERSAND_DETAILS kompatibel ist.

  2. Tabellentyp korrigieren: Stellen Sie sicher, dass beide Tabellen (LIEFERANT und VERSAND_GRID) vom Typ InnoDB sind. Dies ist entscheidend, da Fremdschlüsselbeschränkungen in anderen Speicher-Engines wie MyISAM nicht unterstützt werden.

  3. 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 als INT(6) definiert ist, müssen alle Fremdschlüsselreferenzen ebenfalls vom selben Typ sein.

  4. 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!