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:
- was ist das problem mit meinen Tabellen in MySQL?
- Fehlercode :1822. Fremdschlüsselbeschränkung konnte nicht hinzugefügt werden
- #1005 (Fehler-Nr :150 „Fremdschlüsseleinschränkung ist falsch gebildet“)
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.