2011-12-21 54 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