2011-12-21 13 views
1

私は2つのテーブルで同じトリガーを持っています。両方向の更新後のmysqlトリガー

最初の1:

CREATE TRIGGER updateURL1 AFTER UPDATE ON table1 
FOR EACH ROW 
BEGIN 
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname; 
END; 

秒1:

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2 
FOR EACH ROW 
BEGIN 
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname; 
END; 

私が予想したように、それは明らかであるものを、無限ループを行うことをしようとします。しかし、私にとっては良いことですが、更新されたばかりのテーブルを更新できないためにエラーが発生したため、作成できません。

問題は、私はユーザーのURLや他の多くの情報を編集するためにPHPフォームを使用しています。 mysqlがエラーを引き起こした場合、私はページにそれを書きます。

質問には、mysqlにそのプロシージャのエラーだけをトリガーしないように指示する方法がありますか?

答えて

2

これを無視するエラーについては、declare a handlerとすることができます。

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 

編集これは、あなたが引き金にそれを使用する方法です(と私はちょうどそれを試してみた)

DROP TRIGGER updateURL1; 
DROP TRIGGER updateURL2; 

DELIMITER // 
CREATE TRIGGER updateURL1 AFTER UPDATE ON table1 
FOR EACH ROW 
BEGIN  
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname; 
END// 

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2 
FOR EACH ROW 
BEGIN 
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END; 
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname; 
END// 

DELIMITER ; 

:私は別の方法を考えてきました。次のようなグローバルセッション変数を使用します:

DROP TRIGGER updateURL1; 
DROP TRIGGER updateURL2; 

DELIMITER // 
CREATE TRIGGER updateURL1 AFTER UPDATE ON table1 
FOR EACH ROW 
BEGIN  
    IF @protector IS NULL THEN 
    SET @protector=1; 
    UPDATE table2 SET url=NEW.url WHERE uname=NEW.uname; 
    SET @protector=null; 
    END IF; 
END// 

CREATE TRIGGER updateURL2 AFTER UPDATE ON table2 
FOR EACH ROW 
BEGIN 
    IF @protector IS NULL THEN 
    SET @protector=1; 
    UPDATE table1 SET url=NEW.url WHERE uname=NEW.uname; 
    SET @protector=null; 
    END IF; 
END// 

DELIMITER ; 
+0

どこに入れますか? – Marm

+0

このページの半分の例があります。私はそれを答えに加えます。 –

+0

ありがとう、私はプロテクターと一緒に2番目の方法が本当に好きです。より良いコードとなり、すべてのSQLEXCEPTIONを除外することはありません。 – Marm

関連する問題