• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dwa obce klucze w jednej tabeli odnoszące się do jednego klucza podstawowego

VPS Starter Arubacloud
0 głosów
3,037 wizyt
pytanie zadane 27 lipca 2017 w SQL, bazy danych przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 27 lipca 2017 przez plkpiotr

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?

1 odpowiedź

0 głosów
odpowiedź 31 lipca 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
 
Najlepsza

Analogiczna sytuacja z zapytaniem SELECT:

Forum PHP PL - "dwa klucze obce z jednej tabeli"

Podobne pytania

0 głosów
0 odpowiedzi 473 wizyt
pytanie zadane 14 lipca 2019 w PHP przez niezalogowany
0 głosów
1 odpowiedź 1,139 wizyt
pytanie zadane 29 listopada 2017 w SQL, bazy danych przez olszew6018 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 18 grudnia 2017 w Rozwój zawodowy, nauka, praca przez LockeLamora Użytkownik (740 p.)

92,977 zapytań

141,940 odpowiedzi

321,182 komentarzy

62,303 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...