MySQL триггер на события вставки / обновления
Итак, у меня есть два таких стола...
ext_words
-------------
| id | word |
-------------
| 1 | this |
-------------
| 2 | that |
-------------
| 3 | this |
-------------
ext_words_count
---------------------
| id | word | count |
---------------------
| 1 | this | 2 |
---------------------
| 2 | that | 1 |
---------------------
я пытаюсь создать триггер, который будет:
- обновление
ext_words_count.count
, когдаext_words.word
обновляется.
чтобы еще больше усложнить дело,
- если
ext_words.word
не существуетext_words_count
, когдаext_words
обновлено, я хотел бы вставить его вext_words_count
и setcount
как 1.
я смотрел на подобное вопросы:
1. до / после вставки триггера с помощью поля автоматического приращения и
2. использование триггера для обновления таблицы в другой базе данных
пытаюсь объединить 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 ;
любые советы и направления очень ценятся. Или, возможно, другой метод, который я упустил из виду, и как всегда заранее спасибо!
обновление:
Я выбрал через 2 триггеры, один для вставки и один для обновления, потому что я не знаком с условными операторами в 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 ;
запрос вставки работает отлично, однако запрос обновления не обновляется word_count
. Есть ли что-то, что я пропустил в запросе обновления..?
2 ответов
С совершенным помочь Grijesh и его предложение использовать условные операторы, я был в состоянии получить один триггер, который выполняет обе задачи. Еще раз спасибо 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;
избегайте использования ключевых слов, таких как 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 ;