Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] problem z relacjami
Forum PHP.pl > Forum > Przedszkole
@rtur
  1. CREATE TABLE IF NOT EXISTS `mecze` (
  2. `druzyna1_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  3. `druzyna2_id` int(10) UNSIGNED NOT NULL DEFAULT '0',
  4. `data` datetime DEFAULT NULL,
  5. PRIMARY KEY (`druzyna1_id`,`druzyna2_id`),
  6. UNIQUE KEY `data` (`data`),
  7. KEY `druzyna1_id` (`druzyna1_id`),
  8. KEY `druzyna2_id` (`druzyna2_id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  10.  
  11. CREATE TABLE IF NOT EXISTS `druzyny` (
  12. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  13. `name` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  14. PRIMARY KEY (`id`),
  15. UNIQUE KEY `name` (`name`),
  16. KEY `id` (`id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  18.  
  19.  
  20. ALTER TABLE `mecze`
  21. ADD CONSTRAINT `mecze_ibfk_3` FOREIGN KEY (`druzyna1_id`) REFERENCES `druzyny` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  22. ADD CONSTRAINT `mecze_ibfk_4` FOREIGN KEY (`druzyna2_id`) REFERENCES `druzyny` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;


Zrobiłem sobie taką tabelę i ona działa doskonale usuwam drużynę z tabeli druzyny, automatycznie usuwaja sie mecze w których drużyny brały udział i jest ok, ale mi potrzeba aby w tabeli mecze wartość druzyna1_id i druzyna2_id przybierały wartość 0 lub null jak biorę zamiast ON DELETE CASCADE ON DELETE SET NULL to dostaje Błąd podczas tworzenia klucza zewnętrznego na druzyna1_id (należy sprawdzić typy danych) Błąd podczas tworzenia klucza zewnętrznego na druzyna2_id (należy sprawdzić typy danych), w czym tkwi problem
trueblue
  1. `druzyna1_id` int(10) UNSIGNED [b]NOT NULL[/b] DEFAULT '0',
  2. `druzyna2_id` int(10) UNSIGNED [b]NOT NULL[/b] DEFAULT '0',
@rtur
Jak rozumiem:
  1. ALTER TABLE `mecze`
  2. ADD CONSTRAINT `mecze_ibfk_3` FOREIGN KEY (`druzyna1_id`) REFERENCES `druzyny` (`id`) ON DELETE SET DEFAULT ON UPDATE CASCADE,
  3. ADD CONSTRAINT `mecze_ibfk_4` FOREIGN KEY (`druzyna2_id`) REFERENCES `druzyny` (`id`) ON DELETE SET DEFAULT ON UPDATE CASCADE;

zamiast:
  1. ALTER TABLE `mecze`
  2. ADD CONSTRAINT `mecze_ibfk_3` FOREIGN KEY (`druzyna1_id`) REFERENCES `druzyny` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  3. ADD CONSTRAINT `mecze_ibfk_4` FOREIGN KEY (`druzyna2_id`) REFERENCES `druzyny` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

powinno po usunięciu ustawić wartość '0' dla druzyna1_id i druzyna2_id a tym czasem dostaje
Cytat
ALTER TABLE `mecze` ADD CONSTRAINT `mecze_ibfk_3` FOREIGN KEY ( `druzyna1_id` ) REFERENCES `druzyny` ( `id` ) ON DELETE SET DEFAULT ON UPDATE CASCADE ,
ADD CONSTRAINT `mecze_ibfk_4` FOREIGN KEY ( `druzyna2_id` ) REFERENCES `druzyny` ( `id` ) ON DELETE SET DEFAULT ON UPDATE CASCADE ;
MySQL zwrócił komunikat: Dokumentacja
#1005 - Nie można stworzyć tabeli 'test.#sql-6131_a8ba48c' (Kod błędu: 150)


co robię nie tak?
trueblue
Proponowałem Ci zdjęcie "NOT NULL" z pól.
Natomiast jeśli chcesz użyć akcji "SET DEFAULT", to przeczytaj dobrze dokumentację.

EDIT. No, tak, ale masz klucz z tych dwóch pól. Pozostaje opcja 2, która i tak będzie kolidować z restrykcjami klucza.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.