Najpierw spróbuj przeanalizować i zrozumieć swój schemat. Nie widzę powodu, dlaczego teamname
powinien być częścią klucza podstawowego. ID
kolumna jest już unikalna ze względu na AUTO_INCREMENT
opcja. Możesz więc po prostu ustawić go jako klucz podstawowy.
Teraz przeanalizuj ograniczenia dotyczące teamname
. Jeśli dwie drużyny nie mogą mieć tej samej nazwy, należy zdefiniować UNIQUE KEY
ograniczenie na teamname
. Jeśli każdy zespół musi mieć nazwę, powinieneś zdefiniować NOT NULL
ograniczenie na teamname
. Z tymi ograniczeniami teams
można utworzyć jako:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Teraz możesz użyć teamname
kolumna do identyfikacji wiersza w teams
tabeli i może używać go jako klucza obcego w innych tabelach. Twój kod dla players
tabela powinna teraz działać (patrz demonstracja
).
Zauważ, że zwykle klucz obcy odwołuje się do klucza podstawowego innej tabeli. players
tabela będzie zdefiniowana 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)
);
Jeśli chcesz znać nazwę drużyny zawodnika, użyj JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Uwaga:W ciągu ostatnich kilku dni wielokrotnie widziałem pytania o tym samym wzorze. Wzorzec to:klucz obcy, który odwołuje się do części klucza podstawowego w innej tabeli. Kilka przykładów:
- na czym polega problem z moimi tabelami w mysql?
- Kod błędu :1822. Nie udało się dodać ograniczenia klucza obcego
- #1005 (errno :150 „Ograniczenie klucza obcego jest nieprawidłowo utworzone”)
Komentarze i odpowiedzi sugerowały zdefiniowanie prostego indeksu w tabeli, do której się odwołuje, w celu obsługi sprawdzania ograniczeń FK. Nie rób tego! Zastanów się, czy spróbujesz rozwiązać swój problem, po prostu definiując indeks w teamname
w teams
tabela z:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL to zaakceptuje (zobacz demo ). Ale twój schemat dopuszcza dwie drużyny o tej samej nazwie. Zakładając, że masz dwie drużyny o nazwie „małpy”. I masz gracza, który ma „małpy” jako nazwę drużyny (FK). Który z dwóch zespołów jest wymieniony? Nie możesz powiedzieć! Więc lepiej trzymaj się prostych zasad. A reguła dla kluczy obcych jest następująca:Odwołuj się tylko do pełnych KLUCZY UNIKATOWYCH lub PODSTAWOWYCH. Lub jeszcze prościej:odwołuj się tylko do pełnych KLUCZY PODSTAWOWYCH. Wartość klucza obcego powinna identyfikować konkretny wiersz w tabeli odniesienia.