2011-02-20 6 views
0

트리거에서 Event을 어떻게 중지합니까? 예를 들어 :MySQL 트리거에서 이벤트 중지

CREATE TRIGGER checkPlayer BEFORE INSERT ON players 

BEGIN 

    DECLARE ctr INT; 

    SELECT count(*) 
    INTO ctr 
    FROM players 
    WHERE fName = NEW.fName 
    AND lName = NEW.lName; 

    IF ctr > 0 THEN 
    -- LEAVE and don't insert because player exists 
    END IF; 

END 

답변

1

MySQL은 그런 것들에 대한 SIGNAL 사용 :

SIGNAL이 방법을 "반환"오류가 나는 아래의 간단한 코드가 있습니다. SIGNAL은 핸들러, 응용 프로그램의 외부 부분 또는 클라이언트에 오류 정보를 제공합니다. 또한 오류의 특성 (오류 번호, SQLSTATE 값, 메시지)을 제어 할 수 있습니다. SIGNAL이 없으면 루틴이 오류를 리턴하도록 존재하지 않는 테이블을 의도적으로 참조하는 등의 일시적인 해결책을 사용해야합니다. (AFAIK, 포함, 적절한 SIGNAL 값) 모든 error conditional in a BEFORE trigger

트리거 및 트리거를 발생시킨 문을 중단합니다. 귀하의 MySQL 버전이 SIGNAL을 지원하지 않는 경우 (즉, 버전이 5.5 미만인 경우) 이전의 "존재하지 않는 테이블에서 선택"해킹 또는 "violate a PK by a double INSERT" 해킹과 같은 다른 방법으로 오류를 트리거해야합니다 .

난 단지 SIGNAL 물건을 확인할 수 없으므로 5.1 편리합니다. "19.3.1. 트리거 구문"의 관련 섹션은 5.1, 5.2 및 5.5에서 동일하지만, "오류 발생"클 래지 중 하나가 그러한 일에 의지해야 할 경우 작동해야합니다.

+0

감사합니다. 친구를 찾고 있습니다. 실제로 검색 한 단어를 찾고 있었는데 실제로 말한 "신호"였습니다. – bluezald

1

샘플 코드가있는 신호를 설명하는 미니 블로그 게시물이 있습니다. here을 클릭하십시오. 또한 동일한 기본 키로 두 개의 항목을 삽입하여 예외를 생성하는 대신 데이터베이스에 삽입 문이 포함되지 않은 0으로 나누기 예외를 사용할 수도 있습니다.

관련 문제