3

挿入トリガーを作成しました。ウー。

次のステップは、トリガーの実行後にクエリまたはプロシージャを実行することです。したがって、挿入されたレコードごとではなく、挿入後に。

この電話はどこにかけますか?

DELIMITER $$
DROP TRIGGER /*!50033 IF EXISTS */ triggername $$


CREATE TRIGGER triggername
AFTER INSERT ON tableA
FOR EACH ROW 
BEGIN

/*This runs for each insert - I want it to run at the end of the trigger*/
CALL UpdateOtherStuff(NEW.fieldA, NEW.fieldB);

END$$

ありがとう、

マット

4

1 に答える 1

3

MySQL トリガー構文は制限されています。同じテーブルに複数のトリガーを設定することはできません。データベース レベルのトリガーを使用することはできません。

つまり、MySQL は 1000 個の値を挿入するのか 1 つだけを挿入するのかがわからないため、これを行うことはできません。1 つのステートメントからそれらをトリガーしている場合でも、それらはそれぞれ別個のイベントです。

FOR EACH ROWCREATE TRIGGER構文の固定部分であり、オプションではありません。

同じ問題が発生したとき、ストアド関数を実装し、その関数を使用してコードの挿入と更新の両方を行いました。

関数とストアド プロシージャの制限は、可変数のパラメーターを渡すことができない (insert / update に渡すことができるように) ことや、WHERE 句を渡すことができないなど、多くの制限があります。影響を与えています。

ただし、次のようなフィルタリングの制限を克服できます。

CREATE FUNCTION x(id INTEGER) ...

SELECT x(object_id) FROM objects WHERE ...

その場で関数を実行し、オブジェクトデータを関数内で再選択する必要がないため、MySQLがこれを最適化するかどうかはわかりません。しかし、そうではないと思います...関数内の更新クエリは通常どおり実行されると思います。

于 2012-06-28T00:05:03.387 に答える