

お世話になります。どうかご指導、アドバイス等頂けませんでしょうか。

以下の様な、tbl_productsにデータがinsertされた直後に起動させるトリガーをmysqlで作成しましたが、データを新規にtbl_productsにinsertしても起動いたしません。

[code]

    CREATE TRIGGER `Percent` AFTER INSERT ON `tbl_products`
     FOR EACH ROW BEGIN
    UPDATE
      tbl_products t1,
      ( SELECT id, (rate * number) AS prt
        FROM tbl_products GROUP BY id
      ) t2
    SET
      t1.option = t2.prt
    WHERE
      t1.id = t2.id
    END
    
[/code]

代わりに、上記のBEGIN～ENDの中にある記述をphpMyAdminのSQLから実行すると期待通りの結果になります。（計算結果prtがtbl_productsのカラムoptionに代入されます）

ですので、mysql上でのトリガーの作成方法に問題があるのではないかと考えておりますが、なぜデータをtbl_productsにinsertしてもトリガーを起動させないかご指導頂けませんでしょうか。

~~~~~～～～～～～～～～～～～～～～～  
別テーブルを使用しての記述

[code]

    CREATE TRIGGER `Percent` AFTER INSERT ON `tbl_products`
     FOR EACH ROW BEGIN
    UPDATE
      tbl_product_rate t1,
      ( SELECT tbl_products.id, (rate * number) AS prt
        FROM tbl_products left join tbl_products_rate on tbl_products.id =   tbl_products_rate.id GROUP BY id
      ) t2
    SET
      t1.option = t2.prt
    WHERE
      t1.id = t2.id
    END
    
[/code]


CC BY-SA 3.0
2018-02-01T13:19:49.403
41386
2018-12-04T11:02:10.603
2018-02-02T12:50:46.600
27240
27240
question
mysql
Mysqlでafter insert update triggerの設定方法につきまして。


MySQLトリガーはそのトリガーが設定されているテーブルの自体の改変は認めていません。  
再帰的な呼び出しになる可能性があるからですかね？

「ストアドファンクションまたはトリガーは、そのストアドファンクションまたはトリガーを呼び出したステートメントによって (読み取りまたは書き込みに)
すでに使用されているテーブルを変更できません。」  
<https://dev.mysql.com/doc/refman/5.6/ja/stored-program-restrictions.html>

\--  
追記  
解決方法としては  
・アプリケーションで実装する。  
・別テーブルに書き出してSELECTする場合は別テーブルをJOINする  
・INSERT,UPDATE,DELETE用のテーブルを作り、トリガーを利用して本テーブルに同じようにINSERT,UPDATE,DELETEを実施しさらにやりたいトリガーを実施する  
などいくつか方法があると思います。


CC BY-SA 3.0
2018-02-02T04:20:16.610
41399
2018-02-02T05:48:50.193
2018-02-02T05:48:50.193
22665
22665
41386
answer


なぜトリガーでは動かないのかは、@keitaro_soさんの回答の通りだと思います。  
対応策として、 **MySQLのバージョンが5.7.6以降であれば** 、generated columnが使えるかもしれません。

[code]

    CREATE TABLE triangle (
      sidea DOUBLE,
      sideb DOUBLE,
      sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb))
    );
    INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
    
    mysql> SELECT * FROM triangle;
    +-------+-------+--------------------+
    | sidea | sideb | sidec              |
    +-------+-------+--------------------+
    |     1 |     1 | 1.4142135623730951 |
    |     3 |     4 |                  5 |
    |     6 |     8 |                 10 |
    +-------+-------+--------------------+
    
[/code]

参考  
<https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html>


CC BY-SA 3.0
2018-02-02T08:52:03.767
41407
2018-02-02T08:52:03.767
9608
41386
answer