Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Usuwanie rekordów z kilku tabel na raz
Forum PHP.pl > Forum > Bazy danych
klapaucius
Witam. Mam stosunkowo chyba nie skomplikowany problem, lecz muszę się trochę rozpisać by go przedstawić, więc jesli komuś się bedzie chciało poświęcić chwilę to będę wdzięczny. Do rzeczy. Mam mniej więcej taką taki szkielet tabeli mysql:
  1. CREATE TABLE IF NOT EXISTS `klienci` (
  2. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. PRIMARY KEY (`id`)
  4. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=7 ;
  5.  
  6. CREATE TABLE IF NOT EXISTS `klienci_info` (
  7. `id_klienta` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  8. PRIMARY KEY (`id_klienta`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=7 ;
  10.  
  11. CREATE TABLE IF NOT EXISTS `zamowienia` (
  12. `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  13. `klient_id` int(10) UNSIGNED NOT NULL,
  14. KEY `klient_id` (`klient_id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=57 ;
  16.  
  17. CREATE TABLE IF NOT EXISTS `zamowienia_info` (
  18. `id_zamowienia` int(10) UNSIGNED NOT NULL,
  19. PRIMARY KEY (`id_zamowienia`),
  20. KEY `id_zamowienia` (`id_zamowienia`)
  21. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  22.  
  23. CREATE TABLE IF NOT EXISTS `zamowienia_inny_adres` (
  24. `id_zamowienia` int(10) UNSIGNED NOT NULL,
  25. PRIMARY KEY (`id_zamowienia`)
  26. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  27.  
  28. CREATE TABLE IF NOT EXISTS `zamowienia_inny_kontakt` (
  29. `id_zamowienia` int(10) UNSIGNED NOT NULL,
  30. PRIMARY KEY (`id_zamowienia`)
  31. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  32.  
  33. CREATE TABLE IF NOT EXISTS `zamowienia_notatki` (
  34. `id_zamowienia` int(10) UNSIGNED NOT NULL,
  35. PRIMARY KEY (`id_zamowienia`)
  36. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  37.  
  38. CREATE TABLE IF NOT EXISTS `zamowione_produkty` (
  39. `id_zamowienia` int(10) UNSIGNED NOT NULL,
  40. `ean_produktu` char(13) COLLATE utf8_polish_ci NOT NULL,
  41. KEY `id_zamowienia` (`id_zamowienia`,`ean_produktu`)
  42. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;
  43.  
  44. CREATE TABLE IF NOT EXISTS `generowanie_hasla` (
  45. `id_klienta` int(10) UNSIGNED NOT NULL,
  46. PRIMARY KEY (`id_klienta`)
  47. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;



I teraz chcę jednym zapytaniem usunąć jeden rekord z każej tabeli. Robię więc coś takiego:
  1. DELETE FROM
  2. klienci,
  3. klienci_info,
  4. zamowienia,
  5. zamowienia_info,
  6. zamowienia_inny_adres,
  7. zamowienia_inny_kontakt,
  8. zamowienia_notatki,
  9. zamowione_produkty,
  10. generowanie_hasla
  11. WHERE
  12. klienci.id=1 AND
  13. klienci_info.id_klienta=klienci.id AND
  14. zamowienia.klient_id=klienci.id AND
  15. zamowienia_info.id_zamowienia=zamowienia.id AND
  16. zamowienia_inny_adres.id_zamowienia=zamowienia.id AND
  17. zamowienia_inny_kontakt.id_zamowienia=zamowienia.id AND
  18. zamowienia_notatki.id_zamowienia=zamowienia.id AND
  19. zamowione_produkty.id_zamowienia=zamowienia.id AND
  20. generowanie_hasla.id_klienta = klienci.id

Jednak otrzymuję komunikat:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE klienci.id=1 AND klienci_info.id_klienta=klien' at line 11

Co mogę robić źle..?

Moja wersja bazy: 5.1.63
maly_swd
Moze glupio spytam, a czy SQL pozwala na takie kasowanie?

Jesli bys mial baze na kluczach obcych to mozna kasowac kaskadowo.

A zobacz tak:


  1. DELETE
  2. klienci,
  3. klienci_info,
  4. zamowienia,
  5. zamowienia_info
  6.  
  7. FROM klienci
  8.  
  9. JOIN klienci_info ON klienci_info.id_klienta=klienci.id
  10. JOIN zamowienia ON zamowienia.klient_id=klienci.id
  11. JOIN zamowienia_info ON zamowienia_info.id_zamowienia=zamowienia.id
  12.  
  13. WHERE klienci.id=1


klapaucius
No muszę Ci powiedzieć kolego, że jesteś geniuszem!!! biggrin.gif
Co prawda lekko zmodyfikowałem ten Twój kod i w sumie wygląda teraz tak:
  1. DELETE klienci, klienci_info, zamowienia, zamowienia_info, zamowienia_inny_adres, zamowienia_inny_kontakt, zamowienia_notatki, zamowione_produkty FROM klienci JOIN klienci_info ON klienci_info.id_klienta = klienci.id LEFT JOIN zamowienia ON zamowienia.klient_id = klienci.id LEFT JOIN zamowienia_info ON zamowienia_info.id_zamowienia = zamowienia.id LEFT JOIN zamowienia_inny_adres ON zamowienia_inny_adres.id_zamowienia = zamowienia.id LEFT JOIN zamowienia_inny_kontakt ON zamowienia_inny_kontakt.id_zamowienia = zamowienia.id LEFT JOIN zamowienia_notatki ON zamowienia_notatki.id_zamowienia = zamowienia.id LEFT JOIN zamowione_produkty ON zamowione_produkty.id_zamowienia = zamowienia.id WHERE klienci.id = $id;

ale dzięki Tobie zrozumiałem jak to ma być zrobione.
Co do kluczów obcych to wlasnie niestety mam do dyspozycji bazę bez obslugi InnoDB, więc relacje odpadają sad.gif Ale ważne ze to działa teraz...
Męczyłem się nad tym tyle czasu.. ehh.. Nie wiem jak Ci dziekować.. Jesteś mistrzem smile.gif
Pozdrawiam serdecznie!
maly_swd
fakt, powinno byc LEFT JOIN bo nie koniecznie sa np zamowienia itp.

pozdr.
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.