Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klucz obcy
Forum PHP.pl > Forum > Przedszkole
Xart
Witam mam pewien problem... Stworzyłem sobie 2 tabele powiązane kluczem obcym

  1. CREATE TABLE IF NOT EXISTS `kategorie` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nazwa` char(30) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
  6.  
  7. CREATE TABLE IF NOT EXISTS `produkty` (
  8. `id` int(11) DEFAULT NULL AUTO_INCREMENT,
  9. `kategoria` int(11) DEFAULT NULL,
  10. `nazwa` varchar(10) NOT NULL,
  11. PRIMARY KEY (`id`),
  12. FOREIGN KEY (`kategoria`) REFERENCES kategorie(`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;


dodałem przykładowe rekordy

kategorie 1 i 2
i 5 przykładowych produktów

powinno to chyba działać na tej zasadzie, że jak zmienie id w kateogriach to kolumna kategoria w produktach zmieni się automatycznie bo są powiązane kluczem obcym....
otrzymuje natomiast błąd: #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`produkty`, CONSTRAINT `produkty_ibfk_1` FOREIGN KEY (`kategoria`) REFERENCES `kategorie` (`id`))

W takim razie poco jest ten klucz obcy ?
kartin
Domyślnie dla kluczy obcych stosowane są akcje ON DELETE RESTRICT ON UPDATE RESTRICT. Więc jeśli chcesz aby po zmienianiu ID kategorii zmieniało się ono również w tabeli produkty to musisz na to pozwolić. Tak samo z kasowaniem, można zrobić, że po skasowaniu kategorii zostana skasowane wszystkie produkty z tej kategorii:
  1. CREATE TABLE IF NOT EXISTS `produkty` (
  2. `id` int(11) DEFAULT NULL AUTO_INCREMENT,
  3. `kategoria` int(11) DEFAULT NULL,
  4. `nazwa` varchar(10) NOT NULL,
  5. PRIMARY KEY (`id`),
  6. FOREIGN KEY (`kategoria`) REFERENCES kategorie(`id`) ON DELETE CASCADE ON UPDATE CASCADE
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;


Jeśli nazwa kategorii nie ma zawsze dokładnie 30 znaków to zamiast char(30) użyj varchar(30).
Xart
Dzięki wielkie smile.gif
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.