27

だから私はこのような2つのテーブルを持っています...

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

私は同様の質問を見まし
.

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 ;

アドバイスや指示は大歓迎です。または、私が見落としている別の方法かもしれません。いつものように、事前に感謝します!

更新:
MySQL の条件ステートメントに慣れていないため、INSERT 用と UPDATE 用の 2 つのトリガーを使用することにしました。

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 の完璧な助けと、条件ステートメントを使用するという彼の提案により、両方のタスクを実行する 1 つのトリガーを取得することができました。もう一度ありがとう

 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 に答える