Първо се опитайте да анализирате и разберете вашата схема. Не виждам причина защо teamname
трябва да бъде част от първичния ключ. ID
колоната вече е уникална поради AUTO_INCREMENT
опция. Така че можете просто да го направите първичен ключ.
Сега анализирайте ограниченията за teamname
. Ако два отбора не могат да имат едно и също име, тогава трябва да дефинирате UNIQUE KEY
ограничение за teamname
. Ако всеки отбор трябва да има име, тогава трябва да дефинирате NOT NULL
ограничение за teamname
. С тези ограничения teams
може да бъде създаден като:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
UNIQUE KEY (teamname )
);
Сега можете да използвате teamname
колона, за да идентифицирате ред в teams
таблица и може да я използва като външен ключ в други таблици. Вашият код за players
таблицата вече трябва да работи (вижте демото
).
Имайте предвид, че обикновено външният ключ препраща към първичен ключ на друга таблица. players
таблицата ще бъде дефинирана като:
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)
);
Когато трябва да знаете името на отбора на играч, ще използвате JOIN:
SELECT p.*, t.teamname
FROM players p
LEFT JOIN teams t on t.ID = p.team_id
Забележка:През последните няколко дни виждах въпроси със същия модел отново и отново. Моделът е:Външен ключ, който препраща към част от първичния ключ в друга таблица. Някои примери:
- какъв е проблемът с моите таблици в mysql?
- Код на грешка :1822. Неуспешно добавяне на ограничението за външен ключ
- #1005 (errno :150 „Ограничението за външния ключ е неправилно формирано“)
Коментари и отговори, предложени да се дефинира прост индекс в посочената таблица, за да се поддържа проверката на FK ограничението. Не правете това! Помислете дали се опитате да решите проблема си, като просто дефинирате индекс на teamname
на teams
таблица с:
CREATE TABLE IF NOT EXISTS teams (
ID INT NOT NULL AUTO_INCREMENT,
teamname VARCHAR(255) NOT NULL,
PRIMARY KEY (ID),
INDEX (teamname )
);
MySQL ще приеме това (вижте демонстрация ). Но вашата схема позволява два отбора с едно и също име. Ако приемем, че имате два отбора с името "маймуни". И имате играч, който има "маймуни" като име на отбор (FK). Кой от двата отбора е посочен? Не можеш да кажеш! Така че по-добре се придържайте към прости правила. И правилото за външните ключове е:Позовавайте се само на пълни УНИКАЛНИ или ПЪРВИЧНИ КЛЮЧОВЕ. Или още по-просто:препращайте само към пълните ПЪРВИЧНИ КЛЮЧОВЕ. Стойността на външния ключ трябва да идентифицира конкретен ред в посочената таблица.