Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [SQL][MySQL] Logiczny problem z baza
eminiasty
post 30.11.2017, 19:58:46
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
viking
post 30.11.2017, 20:14:41
Post #2





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Jak wygląda warunek on delete... dla kluczy obcych?


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 30.11.2017, 20:27:42
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


  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
Go to the top of the page
+Quote Post
viking
post 30.11.2017, 20:50:59
Post #4





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


To jak ustawisz zacznie działać samo z siebie. Poza tym to mi wygląda na sql server nie mysql jak w temacie.


--------------------
Go to the top of the page
+Quote Post
phpion
post 30.11.2017, 20:52:16
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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.
Go to the top of the page
+Quote Post
eminiasty
post 30.11.2017, 21:00:05
Post #6





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

Ostrzeżenie: (0%)
-----


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

Ten post edytował eminiasty 30.11.2017, 21:00:27
Go to the top of the page
+Quote Post
phpion
post 30.11.2017, 21:07:35
Post #7





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:38