2013-04-12 22 views
23

Więc mam dwie tabele tak ...
MySQL Wyzwalanie zdarzeń Wstaw/aktualizacja

ext_words 
------------- 
| id | word | 
------------- 
| 1 | this | 
------------- 
| 2 | that | 
------------- 
| 3 | this | 
------------- 

ext_words_count 
--------------------- 
| id | word | count | 
--------------------- 
| 1 | this | 2 | 
--------------------- 
| 2 | that | 1 | 
--------------------- 

Próbuję utworzyć wyzwalacz, który będzie:

  • aktualizacja ext_words_count.count gdy ext_words.word jest aktualizowany .

Aby jeszcze bardziej skomplikować sprawy,

  • jeśli ext_words.word nie istnieje w ext_words_count gdy ext_words jest aktualizowana, chciałbym, aby wstawić go do ext_words_count i ustawić count jako 1.

I szukałem podobnych pytań:
1. Before/after insert trigger using auto increment field i
2. Using Trigger to update table in another database
próbuje połączyć 2. Oto co mam do tej pory:

DELIMITER $$ 
CREATE TRIGGER update_count 
AFTER UPDATE ON ext_words 
FOR EACH ROW 
BEGIN 

    UPDATE ext_words_count 
    SET word_count = word_count + 1 
    WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ; 

Wszelkie porady i kierunek jest bardzo mile widziane. A może jeszcze inna metoda, którą przeoczyłem i jak zawsze z góry dziękuję!

UPDATE:
I wybrały przy użyciu 2 wyzwalacze, jeden dla INSERT i jeden do aktualizacji, ponieważ nie jestem zaznajomiony z instrukcji warunkowych w MySQL.

DELIMITER $$ 
CREATE TRIGGER insert_word AFTER INSERT ON ext_words 
    FOR EACH ROW 
    BEGIN 
     INSERT IGNORE INTO ext_words_count (word) VALUES (NEW.word); 
    END; 
$$ 
DELIMITER ; 

i

DELIMITER $$ 
CREATE TRIGGER update_word AFTER UPDATE ON ext_words 
    FOR EACH ROW 
    BEGIN 
     UPDATE ext_words_count 
     SET word_count = word_count + 1 
     WHERE word = NEW.word; 
    END; 
$$ 
DELIMITER ; 

Kwerenda INSERT działa świetnie, jednak zapytanie UPDATE nie aktualizuje word_count. Czy jest coś, czego mi brakowało w zapytaniu o aktualizację?

+3

może chcesz zobaczyć to, [MySQL przeciwpożarowe Wyzwalacz dla wstawiania i aktualizacji] (http://stackoverflow.com/questions/1318224/mysql-fire-trigger-for-both-insert-and-update) Czy moje rozwiązanie zadziałało? Jaki był wynik, który chciałbym poprawić. Pamiętaj, że nie możesz zaktualizować tej samej tabeli, do której wywołujesz wyzwalacz w MySQL –

+0

@GrijeshChauhan - Dzięki za link! Nie jestem w stanie uzyskać odpowiedzi, ale to dlatego, że jestem nowy w przypadku instrukcji warunkowych w MySQL, a nie z powodu twojego rozwiązania. – Drewness

+0

Mam na myśli to, że gdy ext_words jest zaktualizowane, jeśli słowo nie znajduje się w ext_words_count, to chcę je wstawić i zrobić licznik 1. W przeciwnym razie, jeśli słowo jest w ext_words_count, zwiększ liczbę o 1 ... – Drewness

Odpowiedz

36

Dzięki doskonałej pomocy Grijesh i jego sugestii użycia instrukcji warunkowych, udało mi się uzyskać wyzwalacz ONE, który wykonuje oba zadania. Dzięki jeszcze raz Grijesh

DELIMITER $$ 
CREATE TRIGGER update_count AFTER INSERT ON ext_words 
FOR EACH ROW 
    BEGIN 
    IF NOT EXISTS (SELECT 1 FROM ext_words_count WHERE word = NEW.word) THEN 
     INSERT INTO ext_words_count (word) VALUES (NEW.word); 
    ELSE 
     UPDATE ext_words_count SET word_count = word_count + 1 WHERE word = NEW.word; 
    END IF; 
    END $$  
DELIMITER; 
+0

nice Więc która forma pomogła ci DB.exchange? –

+1

Nigdy nie słyszałem od nikogo. :(Przeglądałem tylko niektóre artykuły. Jeszcze raz dziękuję za całą pomoc i skierowanie mnie na inną stronę! – Drewness

+1

Ten wyzwalacz działa fantastycznie na moim serwerze MySQL w celu odfiltrowania zbędnych wstawek. – Kiwi

3

wykorzystania Należy unikać słów kluczowych, takich jak traktowane jako jej służy metodą sql jakiś czas jej tworzenia błąd, ale niektóre przejazdy dobre

DELIMITER $$ 
CREATE TRIGGER update_count 
    AFTER UPDATE ON ext_words 
    FOR EACH ROW 
     BEGIN 

      SELECT count INTO @x FROM ext_words_count LIMIT 1; 
      UPDATE ext_words_count 
      SET count = @x + 1 
      WHERE word = NEW.word; 

END; 
$$ 
DELIMITER ;