Déclencheur MySQL sur les événements Insert / Update

donc j'ai deux tables comme celle-ci...

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

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

j'essaie de créer un déclencheur qui va:

  • mise à jour ext_words_count.count quand ext_words.word est mis à jour.

Pour compliquer encore les choses,

  • si ext_words.word n'existe pas dans ext_words_count quand ext_words est mise à jour, je voudrais l'insérer dans ext_words_count et mettre count comme 1.

j'ai examiné des questions similaires:

1. avant / après insérer le déclencheur en utilisant la zone d'incrément automatique , et

2. utilisant Trigger pour mettre à jour la table dans une autre base de données

en essayant de combiner les 2. Voici ce que j'ai jusqu'à présent:

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 ;

tout conseil et la direction est grandement apprécié. Ou éventuellement d'une autre méthode que j'ai négligé et comme toujours, merci à l'avance!

mise à jour:

J'ai opté pour l'utilisation de 2 déclencheurs, un pour INSERT et un pour UPDATE parce que je ne suis pas familier avec les déclarations conditionnelles dans 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 ;

et

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 ;

la requête INSERT fonctionne bien, cependant la mise à jour la requête ne met pas à jour word_count . Y a - t-il quelque chose que j'ai manqué dans la requête de mise à jour?.?

25
demandé sur Community 2013-04-12 19:57:40

2 réponses

avec L'aide parfaite de Grijesh et sa suggestion d'utiliser des déclarations conditionnelles, j'ai pu obtenir un déclencheur qui fait les deux tâches. Merci encore 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;   
36
répondu Drewness 2016-09-08 12:36:42

éviter l'utilisation de mots-clés comme count car son est utilisé par la méthode sql un peu de temps son erreur de création, mais certains fonctionne bien

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 ;
3
répondu Aman Maurya 2014-04-27 23:03:13