MySQL 触发插入/更新事件

Posted

技术标签:

【中文标题】MySQL 触发插入/更新事件【英文标题】:MySQL trigger On Insert/Update events 【发布时间】:2013-04-05 05:56:21 【问题描述】:

所以我有两张这样的桌子...

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

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

我正在尝试创建一个触发器,它将:

ext_words.word 更新时更新ext_words_count.count

为了让事情更复杂,

如果更新ext_wordsext_words_count中不存在ext_words.word,我想将其插入ext_words_count并将count设置为1。

我一直在研究类似的问题: 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 ;

非常感谢任何建议和指导。或者可能是我忽略的另一种方法,并且一如既往地提前感谢!

更新: 我选择使用 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。我在更新查询中遗漏了什么......?

【问题讨论】:

您可能想查看此内容,MySQL Fire Trigger for both Insert and Update 我的解决方案有效吗?我想改进的结果是什么。请记住,您不能更新在 MySQL 中调用 trigger 的同一张表 @GrijeshChauhan - 感谢您的链接!我无法让您的答案起作用,但那是因为我对 MySQL 中的条件语句不熟悉,而不是因为您的解决方案。 我的意思是,当 ext_words 更新时,如果单词不在 ext_words_count 中,那么我想插入它并使计数为 1。否则,如果单词在 ext_words_count 中,则将计数增加 1.. . 当然知道了,因为我的查询将不起作用等等... 我有一个简短的问题。如果您将单词以逗号分隔的形式存储在“this,that”之类的其他表中,我们可以在该表上编写触发器来拆分值并将其存储在 ext_words 和 ext_words_count 中吗? 【参考方案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;   

【讨论】:

nice 那么哪种形式对 DB.exchange 有帮助? 从未收到任何人的消息。 :( 我只是浏览了一些文章。再次感谢您的所有帮助并将我指向另一个站点! 这个触发器在我的 MySQL 服务器中工作得非常好,可以过滤掉多余的插入。【参考方案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 ;

【讨论】:

以上是关于MySQL 触发插入/更新事件的主要内容,如果未能解决你的问题,请参考以下文章

用于插入和更新的 MySQL Fire Trigger

触发器处理表更新

laravelEloquent 模型事件和监听方式

当插入事件发生时,我可以将列值更新为触发器吗?

插入后MySql触发器更新选择总和

MySQL 触发器更新最后插入的行