Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie kluczów obcych z tabel
Forum PHP.pl > Forum > Bazy danych > MySQL
grzegorz-gg
Mam przykładowo dwie tabele w bazie
pierwsza tabela to np. tablela z producentami zawiera dwie kolumny

producent_id
producent_name

a druga tabela to tabla zawierajaca produkty posiada cztery kolumny i klucz ocy z tabeli peroducent

produkt_id
producent_id
produkt_nazwa
produkt_opis

jak zrobic cos takiego aby po skasowaniu jednego z producentów automatycznie zmienial sie klucz obcy producent_id w tabeli produkt na pusty ale zeby dane produktu pozostały.

Wydaje mi się że trzeba to zrobić za pomocą Trigger(wyzwalaczy).
nospor
  1. CONSTRAINT `nazwaklucza` FOREIGN KEY (`producent_id`) REFERENCES `producent` (`producent_id`) ON DELETE SET NULL
smile.gif bez triggerow
czyli innym slowy, musisz zalozyc relację, która przy kasowaniu producenta, ustawio pole na null
kszychu
I zmień ten tytuł bo w oczy kłuje...
nospor
z racji maila jakiego dostalem wyjasniam:
kod co podalem, jest kawalkiem zapytania generującego tabelę.

kod w calosci powinien wygladac tak:
  1. CREATE TABLE `faktura` (
  2. `ID` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `id_osoba` int(11) UNSIGNED DEFAULT '0',
  4. `nr` char(1) DEFAULT NULL,
  5. PRIMARY KEY (`ID`),
  6. KEY `id_osoba` (`id_osoba`),
  7. CONSTRAINT `faktura_ibfk_1` FOREIGN KEY (`id_osoba`) REFERENCES `osoba` (`ID`) ON DELETE SET NULL
  8. ) ENGINE=InnoDB DEFAULT CHARSET=latin1
to oczywiscie wycinek mojej tabeli. dostosuj sobie do swojej. moje pole id_osoba, to twoje producent_id. najwazniejszy w tym wszystkim, jest kawalek co ci podalem wczesniej. musisz go dopisac przy genereowaniu swojej tabeli
grzegorz-gg
No niestety nadal nie daje rady wyskakuje mi blad sad.gif
oto moje tabele wydaje mi sie ze dobrze dostosowalem polecenie do swojej bazy ale po zaimportowanu tego kodu wyskakuje mi blad i jest tylko tworzona tabela producent
  1. CREATE TABLE `producent` (
  2. `producent_id` int(10) NOT NULL AUTO_INCREMENT,
  3. `producent_nazwa` varchar(30) collate utf8_bin DEFAULT NULL,
  4. `producent_url` varchar(30) collate utf8_bin DEFAULT NULL,
  5. PRIMARY KEY (`producent_id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;
  7.  
  8. -- --------------------------------------------------------
  9.  
  10. CREATE TABLE `produkt` (
  11. `produkt_id` int(10) NOT NULL AUTO_INCREMENT,
  12. `producent_id` int(10) NOT NULL,
  13. `produkt_nazwa` varchar(30) collate utf8_bin NOT NULL,
  14. `produkt_opis` varchar(500) collate utf8_bin NOT NULL,
  15. PRIMARY KEY (`produkt_id`),
  16. KEY `producent_id` (`producent_id`)
  17. CONSTRAINT `producent_produkt_id` FOREIGN KEY (`producent_id`) REFERENCES `producent` (`producent_id`) ON DELETE SET NULL
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;
dr_bonzo
1. Pokaz ten blad -- przeciez to pomoze rozwiazac problem.
2. Stawiam 1$ na brak przecinka po
KEY `producent_id` (`producent_id`) >>>> , <<<<<

fagment mojego dumpa:
  1. DROP TABLE IF EXISTS `books_authors`;
  2. CREATE TABLE `books_authors` (
  3. `author_id` int(11) NOT NULL,
  4. `book_id` int(11) NOT NULL,
  5. KEY `author_id` (`author_id`),
  6. KEY `book_id` (`book_id`),
  7. CONSTRAINT `books_authors_ibfk_1` FOREIGN KEY (`book_id`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  8. CONSTRAINT `books_authors_ibfk_2` FOREIGN KEY (`author_id`) REFERENCES `authors` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
  9. ) ENGINE=InnoDB DEFAULT CHARSET=latin2;
wiec to dziala.
grzegorz-gg
No niestety po dodanu przecinka tez mam blad uzywam phpMyAdmin 2.7.0 i otrzymmuje taki blad
#1005 - Can't create table '.\test\produkt.frm' (errno: 150)
sad.gif
nospor
Popelniles jeden malutki błąd. Chcesz, żeby pole producent_id bylo ustawiane na null w przypadku, gdy kasowany jest rekord producent. Ale jednoczesnie mowisz, że pole producent_id nie moze byc null. Ja tu widzę pewną sprzeczność. Zresztą nie tylko ja. Baza też ją widzi, dlatego nie pozwala na założenie takiej tabeli. smile.gif

  1. CREATE TABLE `produkt` (
  2. `produkt_id` int(10) NOT NULL AUTO_INCREMENT,
  3. `producent_id` int(10),
  4. `produkt_nazwa` varchar(30) collate utf8_bin NOT NULL,
  5. `produkt_opis` varchar(500) collate utf8_bin NOT NULL,
  6. PRIMARY KEY (`produkt_id`),
  7. KEY `producent_id` (`producent_id`),
  8. CONSTRAINT `producent_produkt_id` FOREIGN KEY (`producent_id`) REFERENCES `producent` (`producent_id`) ON DELETE SET NULL
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin ;
Teraz działa smile.gif

i zmien ten temat jak prosil kszychu, bo te "kluczów" naprawde wali po oczach...
grzegorz-gg
Wielkie dzienki teraz już działa idealnie 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.