web-dev-qa-db-fra.com

Déclencheur MySQL sur les événements d'insertion / mise à jour

J'ai donc deux tableaux comme celui-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:

  • 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 mis à jour, je voudrais l'insérer dans ext_words_count et définissez count sur 1.

J'ai regardé des questions similaires:
1. Avant/après le déclenchement d'insertion à l'aide du champ d'incrémentation automatique , et
2. tilisation de Trigger pour mettre à jour la table dans une autre base de données
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 direction sont grandement appréciés. Ou peut-être une autre méthode que j'ai négligée et comme toujours merci d'avance!

MISE À JOUR:
J'ai opté pour l'utilisation de 2 déclencheurs, un pour INSERT et un pour UPDATE parce que je ne connais pas très bien les instructions 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 très bien, mais la requête UPDATE ne met pas à jour Word_count. Y a-t-il quelque chose que j'ai manqué dans la requête de mise à jour ..?

27
Drewness

Avec l'aide parfaite de Grijesh et sa suggestion d'utiliser des instructions conditionnelles, j'ai pu obtenir UN déclencheur qui effectue 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;   
38
Drewness

éviter d'utiliser des mots clés comme count car il est utilisé par la méthode sql quelque temps, il crée une erreur mais certains fonctionnent 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 ;
4
Aman Maurya