ďťż

[MySQL] wyszukanie rekordów z błędnymi odnośnikami do innych tabel

       

Podstrony


telcocafe

powiedzmy, że mam 2 tabele:
klienci( id int not null auto_increment primary key, nazwa varchar(30) not null ) zamowienia( id int not null auto_increment primary key, idklienta int not null default 0, nazwa_towaru varchar(30) not null )
pole "zamowienia.idklienta" może być większe bądź równe 0. jeśli jest równe 0 - wtedy podejmuję odpowiednią akcję. jeśli jest większe od 0 - przypisuję do niego klienta. ale jak wykryć rekordy tabeli "zamowienia", których idklienta jest niepoprawne (na przykład dane klienta zostały usunięte)?



Jeśli robisz sklep, to albo razem z klientem usuwasz wszelkie po nim ślady, by nie było takich sytuacji, jak teraz, albo dezaktywujesz klienta, za czym idą wszystkie przypisane do niego elementy w bazie.
W sytuacji, jaką masz tutaj wyjściem jest pobranie identyfikatorów klientów, wrzucenie ich do tablicy, dodanie do tego zera i usunięcie zamówień, które nie mają identyfikatora klienta takiego, jak w tablicy. Jest to jednak nieoptymalne rozwiązanie i sprawdza się jedynie przy niewielkiej ilości klientów (im więcej klientów, tym dłuższe później będzie zapytanie usunięcia błędnych zamówień). Przykład:delete from zamowienia where idklienta not in (0,1,2,3,4,5,6,7,8,9,10,11,12)

Można zrobić odwrotnie:

SELECT z.* FROM zamowienia z LEFT JOIN klienci k ON z.idklienta = k.id WHERE k.id IS NULL
Możesz wykonać to zapytanie np. w phpMyAdminie i ręcznie skasować wyświetlone wiersze lub wybrać tylko "id" i skasować metodą opisaną wyżej.
Użytkownik Kozack edytował ten post 07 marzec 2010, 09:50
dzięki za odpowiedzi. w tej chwili skorzystam ze sposobu Kozack'a, bo inaczej nie wyczyszczę bazy. na szczęście w PHPMyAdminie można zaznaczać wiele rekordów do usunięcia :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.