Stworzyłem trzy tabele w bazie danych: players, matches i messages:
CREATE TABLE `players` (
`id` int(11) NOT NULL,
`name` varchar(15) COLLATE utf8_polish_ci NOT NULL,
`surname` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`nick` varchar(10) COLLATE utf8_polish_ci NOT NULL,
`team` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`sex` varchar(5) COLLATE utf8_polish_ci NOT NULL,
`avatar` varchar(11) COLLATE utf8_polish_ci NOT NULL,
`birth` date NOT NULL,
`number_matches_won` int(11) NOT NULL,
`number_matches_lost` int(11) NOT NULL,
`number_sets_won` int(11) NOT NULL,
`number_sets_lost` int(11) NOT NULL,
`number_points_scored` int(11) NOT NULL,
`number_points_lost` int(11) NOT NULL,
`password` varchar(64) COLLATE utf8_polish_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
CREATE TABLE `matches` (
`id` int(11) NOT NULL,
`team` varchar(20) COLLATE utf8_polish_ci NOT NULL,
`home` int(11) NOT NULL,
`away` int(11) NOT NULL,
`result_home` tinyint(4) NOT NULL,
`result_away` tinyint(4) NOT NULL,
`first_set_home` tinyint(4) NOT NULL,
`first_set_away` tinyint(4) NOT NULL,
`second_set_home` tinyint(4) NOT NULL,
`second_set_away` tinyint(4) NOT NULL,
`third_set_home` tinyint(4) NOT NULL,
`third_set_away` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
CREATE TABLE `messages` (
`id` int(11) NOT NULL,
`date` datetime NOT NULL,
`content` varchar(300) COLLATE utf8_polish_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
Gdzie klucze podstawowe określone są jak niżej:
ALTER TABLE `matches`
ADD PRIMARY KEY (`id`);
ALTER TABLE `messages`
ADD PRIMARY KEY (`date`);
ALTER TABLE `players`
ADD PRIMARY KEY (`id`);
Chciałbym, aby messages.id było kluczem obcym klucza podstawowego players.id, co wykonałem poleceniem:
ALTER TABLE messages
ADD FOREIGN KEY (id) REFERENCES players (id);
Czy poprawnie?
Zaś, aby matches.home i matches.away były kluczami obcymi klucza podstawowego players.id i tutaj nie wiem jak tą relację sprecyzować? Jeden do wielu? Czy po prostu dwa klucze obce w jednej tabeli?
Poniższe próby powodują błędy:
ALTER TABLE matches
ADD FOREIGN KEY (home, away) REFERENCES players (id, id);
-- #1005
ALTER TABLE matches
ADD FOREIGN KEY (home) REFERENCES players (id)
...
ALTER TABLE matches
ADD FOREIGN KEY (away) REFERENCES players (id)
-- #1452
Dwa obce klucze w jednej tabeli odnoszące się do jednego klucza podstawowego? Czy jest to możliwe?