Prøv først at analysere og forstå dit skema. Jeg kan ikke se en grund til hvorfor teamname
bør være en del af den primære nøgle. ID
kolonnen er allerede unik på grund af AUTO_INCREMENT
mulighed. Så du kan bare gøre den til primær nøgle.
Analyser nu begrænsningerne på teamname
. Hvis to hold ikke kan have det samme navn, skal du definere en UNIQUE KEY
begrænsning på teamname
. Hvis hvert hold skal have et navn, skal du definere en NOT NULL
begrænsning på teamname
. Med disse begrænsninger er teams
kan oprettes som:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Nu kan du bruge teamname
kolonne for at identificere en række i teams
tabel, og kan bruge den som fremmednøgle i andre tabeller. Din kode til players
tabellen skulle nu fungere (se demo
).
Bemærk, at en fremmednøgle normalt refererer til en primærnøgle i en anden tabel. players
tabel ville blive defineret som:
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)
);
Når du har brug for at kende holdnavnet på en spiller, skal du bruge et JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Bemærk:I de sidste par dage har jeg set spørgsmål med det samme mønster igen og igen. Mønstret er:En fremmednøgle, som refererer til en del af den primære nøgle i en anden tabel. Nogle eksempler:
- hvad er problemet med mine tabeller i mysql?
- Fejlkode :1822. Kunne ikke tilføje fremmednøglebegrænsningen
- #1005 (errno) :150 "Foreign key constraint er forkert dannet")
Kommentarer og svar foreslået for at definere et simpelt indeks på den refererede tabel for at understøtte FK-begrænsningskontrollen. Gør det ikke! Overvej om du prøver at løse dit problem ved blot at definere et indeks på teamname
på teams
tabel med:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL vil acceptere det (se demo ). Men dit skema tillader to hold med samme navn. Forudsat at du har to hold med navnet "aber". Og du har en spiller, der har "aber" som holdnavn (FK). Hvilket af de to hold refereres til? Det kan du ikke sige! Så du må hellere holde dig til simple regler. Og reglen for fremmednøgler er:Henvis kun til fulde UNIQUE eller PRIMÆRE NØGLER. Eller endnu enklere:Henvis kun til fulde PRIMÆRE NØGLER. En fremmednøgleværdi skal identificere en specifik række i den refererede tabel.