Nejprve se pokuste analyzovat a pochopit své schéma. Nevidím důvod, proč teamname
by měl být součástí primárního klíče. ID
sloupec je již jedinečný díky AUTO_INCREMENT
volba. Takže z něj můžete udělat primární klíč.
Nyní analyzujte omezení teamname
. Pokud dva týmy nemohou mít stejné jméno, měli byste definovat UNIQUE KEY
omezení na teamname
. Pokud musí mít každý tým název, měli byste definovat NOT NULL
omezení na teamname
. S těmito omezeními teams
lze vytvořit jako:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Nyní můžete použít teamname
k identifikaci řádku v teams
tabulky a lze jej použít jako cizí klíč v jiných tabulkách. Váš kód pro players
tabulka by nyní měla fungovat (viz ukázka
).
Všimněte si, že cizí klíč obvykle odkazuje na primární klíč jiné tabulky. players
tabulka by byla definována jako:
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)
);
Když potřebujete znát název týmu hráče, použijte JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Poznámka:V posledních dnech jsem znovu a znovu viděl otázky se stejným vzorem. Vzor je:Cizí klíč, který odkazuje na část primárního klíče v jiné tabulce. Několik příkladů:
- v čem je problém s mými tabulkami v mysql?
- Kód chyby :1822. Nepodařilo se přidat omezení cizího klíče
- #1005 (errno :150 „Omezení cizího klíče je nesprávně vytvořeno“)
Komentáře a odpovědi navrhovaly definovat jednoduchý index v odkazované tabulce na podporu kontroly vazby FK. Nedělejte to! Zvažte, zda se pokusíte problém vyřešit pouhým definováním indexu na teamname
v teams
tabulka s:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL to přijme (viz ukázku ). Ale vaše schéma umožňuje dva týmy se stejným názvem. Za předpokladu, že máte dva týmy s názvem „opice“. A máte hráče, který má jako název týmu "opice" (FK). Na který z těchto dvou týmů se odkazuje? Nemůžeš říct! Raději se tedy držte jednoduchých pravidel. A pro cizí klíče platí:Odkazujte pouze na úplné UNIKÁTNÍ nebo PRIMÁRNÍ KLÍČE. Nebo ještě jednodušší:Odkazujte pouze na plné PRIMÁRNÍ KLÍČE. Hodnota cizího klíče by měla identifikovat konkrétní řádek v odkazované tabulce.