Подтвердить что ты не робот

Триггер MySQL Включение/обновление событий

Итак, у меня есть две таблицы, подобные этой...

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

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

Я пытаюсь создать триггер, который будет:

  • update ext_words_count.count при обновлении ext_words.word.

Чтобы еще больше усложнить ситуацию,

  • Если ext_words.word не существует в ext_words_count, когда обновляется ext_words, я хотел бы вставить его в ext_words_count и установить count как 1.

Я рассматривал похожие вопросы:
1. До/после запуска триггера с использованием поля автоматического увеличения и
2. Использование Trigger для обновления таблицы в другой базе данных
пытаясь объединить 2. Вот что я до сих пор:

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 ;

Приветствуются любые советы и указания. Или, возможно, другой метод, который я забыл и как всегда заблаговременно заблаговременно!

UPDATE:
Я выбрал использование двух триггеров, один для INSERT и один для UPDATE, потому что я не знаком с условными операторами 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 ;

и

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 ;

Запрос INSERT работает отлично, однако запрос UPDATE не обновляет word_count. Есть что-то, что я пропустил в запросе обновления.?

4b9b3361

Ответ 1

С полной поддержкой Grijesh и его предложением использовать условные утверждения я смог получить триггер ONE, который выполняет обе задачи. Еще раз спасибо 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;   

Ответ 2

избегать использования ключевых слов, таких как count, поскольку его используется методом sql некоторое время его создает ошибку, но некоторые работают хорошо

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 ;