sql >> データベース >  >> RDS >> Mysql

MySQLトリガーでトランザクションのような機能を使用できますか

    はい、できますが、その方法はバージョンによって異なります。

    まず第一に、トリガー自体はトランザクションです。あなたの状況では、さらに2つの挿入を実行する挿入トリガーがあります。それらのいずれかが失敗した場合、あなたはあなたの望む効果を得るでしょう。

    次の例を考えてみましょう:

    CREATE TABLE a (colA INT);
    CREATE TABLE b (colB INT);
    CREATE TABLE c (colC INT);
    delimiter :
    CREATE TRIGGER testtrig BEFORE INSERT ON a
      FOR EACH ROW BEGIN
        INSERT INTO b(colB) VALUES(NEW.colA);
        INSERT INTO c(banana) VALUES (NEW.colA); -- note the faulty column name
    END;:
    delimiter ;
    

    失敗した挿入を実行すると、次のようになります。

    mysql> INSERT INTO a VALUES (5);
    ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
    mysql> SELECT * FROM a;
    Empty set (0.00 sec)
    

    これは希望する結果と一致します。

    より一般的には、挿入を試みる前にデータを検証するために使用できるロジックがある場合、さまざまな方法でトリガーを失敗させることができます。

    質問のリンクから5.0を使用していると思います。必要に応じて、トリガーを失敗させるために、たとえば無効な列に意図的に挿入するなど、意図的なエラーを実行できます。ただし、質問で説明した状況は、私の回答の冒頭で説明したように、すでにトランザクションで処理されています。



    1. 死のphp白い画面

    2. vbデータソースにmysqldbテーブルを追加できません

    3. データベース管理のためにAmazonEC2で見たいもの

    4. MariaDBのCOUNT()関数