2013-04-12 3 views
23

Поэтому у меня есть две таблицы, как это ...
MySQL триггер на события Insert/Update

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 и установите count как 1.

I рассматривали аналогичные вопросы:
1. Before/after insert trigger using auto increment field и
2. Using Trigger to update table in another database
пытается совместить 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:
Я выбрал для использования 2 триггеров, один для 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. Есть что-то, что я пропустил в запросе на обновление ..?

+3

Вы можете, как смотреть это, [MySQL Огонь Триггер для вставки и обновления] (http://stackoverflow.com/questions/1318224/mysql-fire-trigger-for-both-insert-and-update) Помогло ли мое решение? Какой результат я хотел бы улучшить. Помните, что вы не можете обновить ту же таблицу, на которую вы вызываете триггер в MySQL –

+0

@GrijeshChauhan - Спасибо за ссылку! Я не могу заставить ваш ответ работать, но это потому, что я новичок в условных операторах MySQL, а не из-за вашего решения. – Drewness

+0

Я имею в виду, что когда ext_words обновляется, если слово не находится в ext_words_count, тогда я хочу вставить его и сделать счет 1. В противном случае, если слово находится в ext_words_count, увеличьте количество на 1 ... – Drewness

ответ

36

С полной поддержкой 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; 
+0

nice Итак, какая форма помогла вам DB.exchange? –

+1

Никогда не слышал ни от кого. :(Я просто просматривал некоторые статьи. Еще раз спасибо за вашу помощь и указав на другой сайт! – Drewness

+1

Этот триггер фантастически работает на моем сервере MySQL, чтобы отфильтровать избыточные вставки. – Kiwi

3

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