2012-04-29 3 views
10

My storage is INNODB, IF 문에서 2 개의 쿼리를 사용하여 트리거를 만들려고합니다. 은 아래로 당신이 2 내가 첫 번째로 활성화 트리거에있는 나에게 오류Mysql 트리거가 IF 인 경우

delimiter | 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
    FOR EACH ROW BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN 
     DELETE FROM videos_categories WHERE id_video = OLD.id; 
     DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END IF; 
    END; 
| 
delimiter ; 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= OLD.id; 
    END IF; 
    END' at line 6 

을 제공하는 트리거를 볼 수 있습니다.

delimiter | 
CREATE TRIGGER count_delete_videos_tags AFTER DELETE ON videos_tags 
    FOR EACH ROW BEGIN 
    UPDATE tags SET count = count - 1 WHERE id = OLD.id_tag; 
    END; 
| 
delimiter ; 


delimiter | 
CREATE TRIGGER count_delete_videos_categories AFTER DELETE ON videos_categories 
    FOR EACH ROW BEGIN 
    UPDATE categories SET count = count - 1 WHERE id = OLD.id_category; 

    IF OLD.id_category <> 20 AND OLD.id_category <> 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='english'; 
    ELSEIF OLD.id_category = 34 THEN 
     UPDATE counts SET count=count-1 WHERE name='german'; 
    ELSEIF OLD.id_category = 20 THEN 
     UPDATE counts SET count=count-1 WHERE name='italian'; 
    END IF; 
    END; 
| 
delimiter ; 

그러나이 하나

delimiter | 
    CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
     FOR EACH ROW BEGIN 
     UPDATE counts SET count = count - 1 WHERE name = 'all'; 

     IF OLD.published = 1 THEN 
      DELETE FROM videos_categories WHERE id_video = OLD.id; 
     END IF; 
     END; 
    | 
    delimiter ; 

Query OK, 0 rows affected (0.16 sec) 

어떻게 내가 먼저 트리거 작업을 할 수 완벽하게 작동? 내가 뭘 잘못하고있어? 나를 도와 주신 Thx.

+0

각 delete 문에 대해 if 절을 두 번 줄 수 있습니까? – nawfal

+0

(카운터 제외) FON을'ON DELETE CASCADE '으로 정의하여 외장 키 제약 조건 (각 테이블에서 하나씩)과'video' 테이블에서 동일한 동작을 할 수 있다는 것을 알고 계십니까? –

+0

그래, 나도 알아,하지만 foreing 열쇠에 MySQL에서 트리거가 활성화되지 않습니다, 그래서 다른 트리거와 함께이 쿼리를 삭제해야합니다 다른 검색어를 활성화 –

답변

12

지금까지 내가 모두 트리거가 OK입니다 말할 수 있지만, 당신이 시도 할 수 있습니다으로 다음

DELIMITER $$ 
CREATE TRIGGER count_delete_videos BEFORE DELETE ON videos 
FOR EACH ROW 
BEGIN 
    UPDATE counts SET count = count - 1 WHERE name = 'all'; 

    IF OLD.published = 1 THEN BEGIN 
    DELETE FROM videos_categories WHERE id_video = OLD.id; 
    DELETE FROM videos_tags WHERE id_video = OLD.id; 
    END; END IF; 
END$$ 

DELIMITER ; 
+0

이것은 내가 뭘 -> 오류 1235 (42000) :이 MySQL 버전 doesn ' 아직 한 테이블에 대해 동일한 동작 시간과 이벤트를 가진 '다중 트리거'를 지원합니다. –

+0

@ P.Alex - MySQL 버전은 무엇입니까? –

+1

@ P.Alex, 분명히이 트리거를 추가하기 전에 다른 트리거를 삭제해야합니다. – Johan

-1

DELIMITER $$ 각 행 를 차지 ON UPDATE 전에 트리거 upd_check을 만들 BEGIN

 IF NEW.amount > 100 THEN 
      SET NEW.amount = 100 
    END END IF 
    END$$ 
    DELIMITER ; 
이 코드의

은 # 1064와 같은 오류를 표시합니다. - SQL 구문에 오류가 있습니다. 라인 7에서 'END END IF END'근처에서 사용할 올바른 구문에 대한 MariaDB 서버 버전을 확인하십시오.