Probeer eerst uw schema te analyseren en te begrijpen. Ik zie geen reden waarom teamname
moet deel uitmaken van de primaire sleutel. De ID
kolom is al uniek vanwege de AUTO_INCREMENT
keuze. Je kunt er dus gewoon een primaire sleutel van maken.
Analyseer nu de beperkingen op teamname
. Als twee teams niet dezelfde naam kunnen hebben, moet u een UNIQUE KEY
definiëren beperking op teamname
. Als elk team een naam moet hebben, moet u een NOT NULL
define definiëren beperking op teamname
. Met deze beperkingen zullen de teams
kan worden gemaakt als:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Nu kunt u de teamname
. gebruiken kolom om een rij te identificeren in de teams
table, en kan het gebruiken als refererende sleutel in andere tabellen. Uw code voor de players
tabel zou nu moeten werken (zie demo
).
Merk op dat een externe sleutel meestal verwijst naar een primaire sleutel van een andere tabel. De players
tabel zou worden gedefinieerd 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)
);
Als je de teamnaam van een speler wilt weten, gebruik je een JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Opmerking:de afgelopen dagen heb ik steeds weer vragen met hetzelfde patroon gezien. Het patroon is:Een externe sleutel die verwijst naar een deel van de primaire sleutel in een andere tabel. Enkele voorbeelden:
- wat is het probleem met mijn tabellen in mysql?
- Foutcode :1822. Kan de externe sleutelbeperking niet toevoegen
- #1005 (errno :150 "Foreign key constraint is onjuist gevormd")
Opmerkingen en antwoorden stelden voor om een eenvoudige index op de tabel waarnaar wordt verwezen te definiëren om de FK-beperkingscontrole te ondersteunen. Doe dat niet! Overweeg of u uw probleem probeert op te lossen door een index te definiëren op teamname
op de teams
tafel met:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL accepteert dat (zie demo ). Maar uw schema staat twee teams met dezelfde naam toe. Ervan uitgaande dat je twee teams hebt met de naam "apen". En je hebt een speler die "apen" als teamnaam (FK) heeft. Naar welke van de twee teams wordt verwezen? Je kunt het niet zeggen! Je kunt je dus maar beter aan simpele regels houden. En de regel voor buitenlandse sleutels is:verwijs alleen naar volledige UNIEKE of PRIMAIRE SLEUTELS. Of nog eenvoudiger:verwijs alleen naar volledige PRIMAIRE SLEUTELS. Een externe sleutelwaarde moet een specifieke rij in de tabel waarnaar wordt verwezen identificeren.