Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Jak kasować dane z wielu tabel jednocześnie?
Forum PHP.pl > Forum > Przedszkole
mefjiu
Witam mam pytanie jak kasować dane z wielu tabel jednocześnie?
szukałem google, ale jedyne co znalazłem to http://algorytmy.pl/?id=1043, a niestety nie mam tam dostępu :-(
Zna ktoś sposób na kasowanie tych danych ?

Z góry dziękuję za odpowiedź
bełdzio
napisz zastosowanie, moze wystarczy stworzyc odpowiednia relacje?
mefjiu
Chciałbym za jednym zamachem skasować dane z 2 tabel są one ze sobą powiązane kolumną
Serp_site.id = Serp_site_statistics.id_site
phpion
Cytat(bełdzio @ 8.03.2009, 19:21:33 ) *
moze wystarczy stworzyc odpowiednia relacje?

To zdecydowanie najlepsze wyjście. Tworzysz relację między tabelami nadając jej ON DELETE CASCADE i po sprawie. Jedyne ograniczenie to typ tabel: dla MYSQL musi to być InnoDB.
mefjiu
Nie bardzo rozumiem ? A czy koniecznie muszę zmieniać typ tabel na InnoDB dla jednego zastosowania szkoda tyle zachodu. Czy nie ma czegoś prostszego ? w algorytmy.pl zapewne jest banalny sposób.
marcio
Robisz kilka zapytan albo tablice z danymi i potem petla for/foreach a w niej zapytanie sql do kasowania tongue.gif
bełdzio
Cytat(mefjiu @ 8.03.2009, 17:37:45 ) *
Nie bardzo rozumiem ? A czy koniecznie muszę zmieniać typ tabel na InnoDB dla jednego zastosowania szkoda tyle zachodu. Czy nie ma czegoś prostszego ? w algorytmy.pl zapewne jest banalny sposób.

zalozmy ze masz 2 tabele kategorie i produkty kazdy produkt nalezy do kategorii, i teraz dzieki relacja usuniecie kategorii skutkuje automatycznym usunieciem produktow ktore do niej nalezaly

a co do zachodu to wystarczy
  1. ALTER TABLE tabela ENGINE = InnoDB
mefjiu
Cytat(marcio @ 8.03.2009, 17:50:58 ) *
Robisz kilka zapytan albo tablice z danymi i potem petla for/foreach a w niej zapytanie sql do kasowania tongue.gif


w tym cały senk aby to zrobić za jednym zapytaniem :-) pętlą to no problem

Cytat(bełdzio @ 8.03.2009, 17:52:50 ) *
zalozmy ze masz 2 tabele kategorie i produkty kazdy produkt nalezy do kategorii, i teraz dzieki relacja usuniecie kategorii skutkuje automatycznym usunieciem produktow ktore do niej nalezaly

a co do zachodu to wystarczy
  1. ALTER TABLE tabela ENGINE = InnoDB


To zastosowanie posypie mi resztę kodu.

Udało mi się odkopać jakiś stary temat w którym poruszany jest ten problem
http://forum.php.pl/index.php?showtopic=54...=0&p=295800
Niestety tu tez kolega nie uzyskał informacji.

Wiec jak widać to nie taki prosty problem.
marcio
A jaki masz problem zeby to skasowac kilkoma zapytaniami?
mefjiu
Cytat(marcio @ 8.03.2009, 18:03:15 ) *
A jaki masz problem zeby to skasowac kilkoma zapytaniami?


Znaczne zmniejszenie wydajności kodu.
kefirek
Robisz coś w ten desen
  1. DELETE FROM tabela1 LEFT JOIN tabela2 ON t1.id=t2.id
bełdzio
Cytat(mefjiu @ 8.03.2009, 17:59:17 ) *
To zastosowanie posypie mi resztę kodu.

why?
marcio
Cytat
Znaczne zmniejszenie wydajności kodu.

Omg przy 2 zapytaniach wiele zasobow ci nie wezmie tongue.gif
mefjiu
Cytat(marcio @ 8.03.2009, 18:18:13 ) *
Omg przy 2 zapytaniach wiele zasobow ci nie wezmie tongue.gif


Ale skoro jest sposób to warto to wykorzystać, jak tak wszędzie będę przymykał oko to wtedy aplikacja będzie zasobo żerna.

Rozwiązanie znalezione podaje dla kolejnych szukjaacych
  1. DELETE mss, msss FROM Serp_site AS mss LEFT JOIN Serp_site_statistics AS msss ON mss.id=msss.id_site
  2. WHERE msss.id_site IS NULL OR mss.id=4
nexik
krótszy kod != wydajniejszy

jak chcesz wyczyscic 2 tabele to najlepiej
TRUNCATE TABLE tabela1
TRUNCATE TABLE tabela2
mls
Cytat(mefjiu @ 8.03.2009, 18:23:06 ) *
Ale skoro jest sposób to warto to wykorzystać, jak tak wszędzie będę przymykał oko to wtedy aplikacja będzie zasobo żerna.

Rozwiązanie znalezione podaje dla kolejnych szukjaacych
  1. DELETE mss, msss FROM Serp_site AS mss LEFT JOIN Serp_site_statistics AS msss ON mss.id=msss.id_site
  2. WHERE msss.id_site IS NULL OR mss.id=4


Skoro już taki "optymalny" jesteś to wiedz, że LEFT JOIN jest znacznie mniej wydajne od wykonania dwóch zapytań bez łączenia ich ze sobą.
Tak jak przedmówcy wspomnieli, albo usuwaj w jakiejś pętli (wówczas najlepiej z transakcjami) albo ustaw triggery.
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.