Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] usuwanie rekordów, jeśli w drugiej tabeli nie ma rekordu o odpowiednim id
Forum PHP.pl > Forum > Przedszkole
ficiek
Witam mam dwie tabele: comments i articles.
Rekordy w articles mają oczywiście id, natomiast komentarze about_id, które odpowiada odpowiednim id artykułów do których są przypisane.
Chcę w jednym zapytaniu mieć możliwość usunięcia wszystkich przestarzałych komentarzy, czyli takich których odpowiadające artykuły usunięto.

Chodzi mi o coś w stylu:
  1. DELETE FROM comments WHERE about_id NOT IN (SELECT id FROM articles)

Niestety nie wiem jak dokładnie to zapisać.
AlexDeLarge
  1. DELETE FROM comments RIGHT JOIN articles ON comments.about_id=articles.id WHERE articles.id IS NULL


LUB

  1. ALTER TABLE comments ENGINE=InnoDB;
  2. ALTER TABLE articles ENGINE=InnoDB;
  3. ALTER TABLE comments ADD FOREIGN KEY 'fk_articles' REFERENCES articles(id) ON DELETE CASCADE;


i...magia, działa samo bez dodatkowych zapytań. Ale uwaga, jeśli korzystasz z wyszukiwania FULLTEXT w jednej z tabel, nie możesz tego zrobić.

//RIGHT JOIN, albo LEFT, zawsze mi się pier...
ficiek
Dzięki, nie mam niestety czasu sprawdzić tego w tym momencie, ale owszem, korzystam z FULLTEXT w tabeli articles. Rozumiem, że w tym wypadku nie zadziała druga możliwość?
AlexDeLarge
No niestety, jeśli korzystasz z wyszukiwania FULLTEXT, to korzystasz z MyISAM, a MyISAM nie obsługuje kluczy obcych.
Sposób numer 3, jeśli masz możliwość tworzenia wyzwalaczy:

  1. delimiter |
  2. CREATE TRIGGER deletecom AFTER DELETE ON articles
  3. FOR EACH ROW BEGIN
  4. DELETE FROM comments WHERE about_id=OLD.id;
  5. END;
  6. |
  7. delimiter ;


Poza tym wkradł się błąd w sposobie numer 2, powinno być:

  1. ALTER TABLE comments ADD CONSTRAINT 'fk_articles' FOREIGN KEY (about_id) REFERENCES articles(id) ON DELETE CASCADE;
ficiek
Tak sobie przypomniałem o tym temacie.

Rozwiązanie które wykorzystałem:
  1. SELECT * FROM comments D WHERE NOT EXISTS (SELECT NULL FROM articles U WHERE D.about_id = U.id)


To jest tylko SELECT więc swobodnie można testować nie bojąc się, że coś nam zniknie.
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.