27

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

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.countext_words.word更新。

让事情更复杂的是,

  • 如果更新时ext_words.word不存在,我想将其插入并设置为1。ext_words_countext_wordsext_words_countcount

我一直在研究类似的问题:
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 个触发器,一个用于 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。我在更新查询中错过了什么..?

4

2 回答 2

38

在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;   
于 2013-04-12T19:01:29.030 回答
4

避免使用 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 ;
于 2014-04-27T22:57:31.037 回答