2011-12-21 2 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 폼을 사용하여 사용자의 URL과 기타 많은 정보를 편집하는 것입니다. 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

고마워, 나는 보호자와 두 번째 방법을 정말 좋아해. 더 나은 코드가 될 것이며 모든 SQLEXCEPTION을 제외하지 않을 것입니다. – Marm