0

特定の条件が満たされた場合に挿入を実行したくない(トランザクションはロールバックする必要がある)状況があります。このロジックはアプリケーションコードで記述できますが、何らかの理由でMySQL自体で記述しなければなりません(たとえば、異なる言語で記述されたクライアントはこのMySQL InnoDBテーブルに挿入されます)[これは別の説明です]。

テーブル定義:

CREATE TABLE table1(x int NOT NULL);

トリガーは次のようになります。

CREATE TRIGGER t1 BEFORE INSERT ON table1
FOR EACH ROW
  IF (condition) THEN
    NEW.x = NULL;
  END IF;
END;

私はそれが(未テスト)と書くこともできると推測しています:

CREATE TRIGGER t1 BEFORE INSERT ON table1
FOR EACH ROW
  IF (condition) THEN
    ROLLBACK;
  END IF;
END;

しかし、これは機能しません:

CREATE TRIGGER t1 BEFORE INSERT ON table1 ROLLBACK;

次のことが保証されます。

  1. DBは常にMySQLになります
  2. テーブルタイプは常にInnoDBになります
  3. そのNOTNULL列は、常にそのままになります

質問:最初の方法で不快なことはありますか?

4

2 に答える 2

1

トリガードキュメントから:

トリガーは、START TRANSACTION、COMMIT、またはROLLBACKなどのトランザクションを明示的または暗黙的に開始または終了するステートメントを使用できません。

2番目のオプションを作成できませんでした。でも:

トリガーが失敗するとステートメントが失敗するため、トリガーが失敗するとロールバックも発生します。

したがって、エラーが発生することが保証されているクエリを使用するというEricの提案は、次のオプションです。ただし、MySQLにはカスタムエラーを発生させる機能がありません。誤検知に対処する必要があります。カスタムエラー処理がないため、ストアドプロシージャ内にカプセル化することは、これ以上良いことではありません...

あなたの状態が何であるかについてより詳細に知っていれば、それは制約を介して処理される可能性があります。

アップデート


MySQLにはCHECK制約構文がありますが、どのエンジンでも強制されていないことを確認しました。テーブルへのアクセスをロックダウンすると、ストアドプロシージャで制限ロジックを処理できます。次のトリガーは、挿入先のテーブルを参照しているため、機能しません。

CREATE TRIGGER t1 BEFORE INSERT ON table1
FOR EACH ROW

  DECLARE num INT;
  SET num = (SELECT COUNT(t.col)
              FROM your_table t
             WHERE t.col = NEW.col);

  IF (num > 100) THEN
    SET NEW.col = 1/0;
  END IF;

END;

..MySQLエラー1235が発生します。

于 2010-06-10T18:09:56.973 に答える
0

エラーを発生させてロールバックを強制しようとしましたか?例えば:

CREATE TRIGGER t1 BEFORE INSERT ON table1
FOR EACH ROW
  IF (condition) THEN
    SELECT 1/0 FROM table1 LIMIT 1
  END IF;
END;
于 2010-06-10T17:52:05.277 に答える