Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL][MySQL] Logiczny problem z baza
Forum PHP.pl > Forum > Przedszkole
eminiasty
Mam tabele powiązane relacjami:
--uczestnicy
id_uczestnika
--szkolenia
id_skzolenia
--szkolenia_uczestnicy
id_szkolenia
id_uczestnika

Znam tylko id_szkolenia, chce usunac wszelkie dane powiazane z szkoleniem(z każdej tabeli)

Co robię obecnie:
1.Usuwam dane z szkolenia uczestnicy
2.Usuwam dane z szkolenia
3 TU problem? Jak usunac z uczestnicy

Problem tu jest z kolejnością usunięcia wszystkich danych
viking
Jak wygląda warunek on delete... dla kluczy obcych?
eminiasty
  1. ALTER TABLE [dbo].[participants_trainings] WITH CHECK ADD CONSTRAINT [FK_participants_trainings_participants] FOREIGN KEY([id_participants])
  2. REFERENCES [dbo].[participants] ([id_participants])
  3. GO


chyba chodzi o ten element? nie ustawiałem nic takiego
viking
To jak ustawisz zacznie działać samo z siebie. Poza tym to mi wygląda na sql server nie mysql jak w temacie.
phpion
Co do problemu nr 3:
  1. DELETE FROM uczestnicy WHERE id_uczestnika NOT IN (SELECT DISTINCT id_uczestnika FROM szkolenia_uczestnicy)

lub:
  1. DELETE FROM uczestnicy WHERE NOT EXISTS (SELECT 1 FROM szkolenia_uczestnicy WHERE szkolenia_uczestnicy.id_uczestnika = uczestnicy.id_uczestnika)

plus kilka innych sposobów np. z użyciem left join ale tu sobie sam googlnij smile.gif

@viking: nawet z kluczem obcym rekordy uczestników nie zostaną usunięte.
eminiasty
czyli metoda vikinga nie zadziala?

nie znam id_uczestnika i musial bym je poprzez tabele posrednia wyciagac (szkolenia_uczestnicy) wiec twoich zapytan nie bardzo rozumiem
phpion
Metoda vikinga jest jak najbardziej słuszna, należy założyć klucze obce dzięki czemu zapewnisz bazie integralność danych. Podczas usuwania rekordu z tabeli szkolenia automatycznie usunięte zostaną rekordy z tabeli szkolania_uczestnicy. To samo sie stanie gdy usuniesz rekord z tabeli uczestnicy,

Moje zapytania nie potrzebują żadnych parametrów. Odpal jedno z nich jako trzecie (lub drugie jeśli założysz klucze obce). Po prostu usuwają z tabeli uczestnicy te rekordy, dla których nie ma wpisów w tabeli szkolenia_uczestnicy. Choć nie wiem czy nie lepiej byłoby jako pierwsze odpalić:
  1. DELETE FROM użytkownicy WHERE id_uzytkownika IN (SELECT id_uzytkownika FROM szkolenia_uzytkownicy WHERE id_szkolenia = $id_usuwanego_szkolenia)

gdyż poprzednie zapytania orają niejako całość tabeli. Jeśli z jakiegoś powodu musisz odpalać to jako trzecie to na jeden z poprzednich sposobów, jeśli nie - użyj powyższego.

Edit:
Powyższe tez ma jedna pułapkę - usunie użytkownika nawet jeśli jest przypisany na usuwane szkolenie oraz dowolne inne. No ale masz kilka wędek - złóż z nich odpowiednią 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.