Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Triggery] Jak to zrobić?
Forum PHP.pl > Forum > Bazy danych > MySQL
ron777
Witam,

Załóżmy, że mamy tabelkę `ogloszenia` z kolumnami: id_ogloszenia, id_miasta, status_ogloszenia.
Mamy drugą tabelkę `ile_ogloszen` z kolumnami: id_miasta, liczba_ogloszen.

Chciałbym utworzyć taki trigger na tabeli ogloszenia, aby po każdym updacie lub insercie wykonało się zapytanie zliczające liczbę ogłoszeń w każdym mieście i aby ta informacja znalazła się w tabeli ile_ogloszen.

Sprawa wygląda prosto- tworzymy trigger, który najpierw czyści tabelę ile_ogloszen a następnie wykonuje do niej inserta z zawartością zapytania select id_miasta, count(*) from ogloszenia group by id_miasta.

Problem jest teraz gdy wykonam sobie na tabeli ogloszenia update, który zmieni mi dużą liczbę rekordów. Czyli dla każdego zmienianego rekordu będzie kolejno odpalane kosztowne zapytanie grupujące (tabela ogloszenia jest bardzo liczna i niektóre updaty zarżnęłyby mi bazę).

Czy da się zrobić taki trigger, aby wykonaywał zadany kod tylko raz niezależnie od liczby affected rows zapytania triggerującego?
Teoretycznie w dokumentacji http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html jest wyraźnie, że klauzula FOR EACH ROW jest zawsze wymagana więc wygląda na to, że nie da się. Może ktoś z Was zna jednak jakiś trick? Będę bardzo wdzięczny za wskazówkę.
awakening
a nie łatwiej przy każdym dodaniu nowego rekordu dodawać +1 do drugiej tabelki? albo -1? -2, +3 +4 itd.
dymsza
jeśli koniecznie chcesz count to możesz do tabeli dodać kolumny do_count i w momencie gdy wiesz że to ostatni wiersz wstawiać te kolumnę z wartością 1 a w trigerze dodać warunek
  1. IF new.do_count = 1 then
  2. TO co ma BYć
  3. end IF;



jednak lepsze to założenie triger na insert i delete i tylko updatowanie wartości w tabli z licznikiem w update table_z_licznikime set liczba = liczba + 1 (dla add ) no i odwrotnie dla delete
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.