Mysql
 sql >> Datenbank >  >> RDS >> Mysql

ER_FK_NO_INDEX_PARENT:Die Fremdschlüsseleinschränkung konnte nicht hinzugefügt werden. Fehlender Index für Einschränkung

Versuchen Sie zunächst, Ihr Schema zu analysieren und zu verstehen. Ich sehe keinen Grund, warum teamname sollte Teil des Primärschlüssels sein. Die ID Spalte ist aufgrund des AUTO_INCREMENT bereits eindeutig Möglichkeit. Sie können ihn also einfach zum Primärschlüssel machen.

Analysieren Sie nun die Einschränkungen für teamname . Wenn zwei Teams nicht denselben Namen haben können, sollten Sie einen UNIQUE KEY definieren Beschränkung auf teamname . Wenn jedes Team einen Namen haben muss, dann sollten Sie einen NOT NULL definieren Beschränkung auf teamname . Mit diesen Einschränkungen haben die teams kann erstellt werden als:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  UNIQUE KEY (teamname )
);

Jetzt können Sie den teamname verwenden Spalte, um eine Zeile in den teams zu identifizieren Tabelle und kann ihn als Fremdschlüssel in anderen Tabellen verwenden. Ihr Code für die players -Tabelle sollte jetzt funktionieren (siehe Demo ). ).

Beachten Sie, dass ein Fremdschlüssel normalerweise auf einen Primärschlüssel einer anderen Tabelle verweist. Die players Tabelle wäre definiert als:

CREATE TABLE IF NOT EXISTS players (
  ID INT NOT NULL AUTO_INCREMENT,
  player_name VARCHAR(255),
  cm INT NOT NULL,
  team_id INT,
  PRIMARY KEY (ID),
  FOREIGN KEY (team_id) REFERENCES teams(ID)
);

Wenn Sie den Teamnamen eines Spielers wissen müssen, würden Sie einen JOIN verwenden:

SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id

Hinweis:In den letzten Tagen habe ich immer wieder Fragen mit dem gleichen Muster gesehen. Das Muster ist:Ein Fremdschlüssel, der einen Teil des Primärschlüssels in einer anderen Tabelle referenziert. Einige Beispiele:

Kommentare und Antworten schlugen vor, einen einfachen Index für die referenzierte Tabelle zu definieren, um die FK-Beschränkungsprüfung zu unterstützen. Tu das nicht! Überlegen Sie, ob Sie versuchen, Ihr Problem zu beheben, indem Sie einfach einen Index für teamname definieren in den teams Tabelle mit:

CREATE TABLE IF NOT EXISTS teams (
  ID INT NOT NULL AUTO_INCREMENT,
  teamname VARCHAR(255) NOT NULL,
  PRIMARY KEY (ID),
  INDEX (teamname )
);

MySQL wird das akzeptieren (siehe Demo ). ). Aber Ihr Schema lässt zwei Teams mit demselben Namen zu. Angenommen, Sie haben zwei Teams mit dem Namen "Affen". Und Sie haben einen Spieler, der "Affen" als Teamnamen (FK) hat. Auf welches der beiden Teams wird verwiesen? Sie können nicht sagen! Halten Sie sich also besser an einfache Regeln. Und die Regel für Fremdschlüssel lautet:Nur vollständige UNIQUE- oder PRIMARY KEYS referenzieren. Oder noch einfacher:Nur vollständige PRIMARY KEYS referenzieren. Ein Fremdschlüsselwert sollte eine bestimmte Zeile in der referenzierten Tabelle identifizieren.