2011-12-21 51 views
1

我在兩個表上有相同的觸發器。兩個方向更新後的mysql觸發器

第一招:

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

第二個:

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

如我所料,它試圖做一個無限循環,什麼是顯而易見的。但是,對我而言,這並不是因爲錯誤被觸發,而是因爲它無法更新剛剛更新的表。

這個問題,我正在使用一個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 2011-12-21 21:02:06

+0

這個頁面有一個例子。我會將其添加到答案中。 – 2011-12-21 22:29:25

+0

非常感謝,我非常喜歡保護者的第二種方式。這將是更好的代碼,並不會排除每個SQLEXCEPTION。 – Marm 2011-12-22 19:57:51