web-dev-qa-db-ja.com

MySQLの挿入/更新イベントのトリガー

だから私はこのような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.countが更新されたときにext_words.Wordを更新します。

問題をさらに複雑にするために、

  • ext_words.Wordが更新されたときにext_words_countext_wordsに存在しない場合、ext_words_countに挿入し、countを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 ;

アドバイスや方向性は大歓迎です。またはおそらく私が見落としていた別の方法といつものように事前に感謝します!

更新:
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を更新していません。更新クエリで見逃したものはありますか?

27
Drewness

Grijeshの完璧な助けと条件付きステートメントの使用の提案により、両方のタスクを実行する[〜#〜] one [〜#〜]トリガーを取得することができました。もう一度感謝します

 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;   
38
Drewness

カウントのようなキーワードの使用は、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 ;
4
Aman Maurya