2012-04-29 6 views
10

Mein Speicher ist INNODB, Ich versuche, einen Trigger mit 2 Abfragen in IF-Anweisung zu erstellen. Unten können Sie den Auslöser sehen, die mir den FehlerMysql Trigger mit WENN THEN

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 

Dies gibt sind die 2 löst, dass ich mit dem ersten aktivieren.

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 ; 

Aber dies funktioniert perfekt

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) 

Wie kann ich erste Trigger Arbeit machen? was mache ich falsch? Danke für die Hilfe.

+0

entspricht. Können Sie die if-Klausel zweimal für jede DELETE-Anweisung angeben und sehen? – nawfal

+0

(Mit Ausnahme der Zähler), wissen Sie, dass Sie das gleiche Verhalten mit einer Fremdschlüsseleinschränkung (eine aus jeder Tabelle) zu der 'video' Tabelle haben können, indem Sie die FKs mit' ON DELETE CASCADE' definieren? –

+0

ja ich weiß, aber auf foreing Schlüssel Trigger in mysql nicht aktivieren, so muss ich es mit einem anderen Trigger löschen, damit diese Abfragen andere Trigger aktivieren –

Antwort

12

Soweit ich sagen kann, beide Trigger sind in Ordnung, aber Sie könnten versuchen Sie Folgendes:

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

Das ist, was ich bekomme -> Fehler 1235 (42000): Diese Version von MySQL doesn ' t noch 'mehrere Trigger mit der gleichen Aktion Zeit und Ereignis für eine Tabelle' –

+0

@ P.Alex - Und was ist Ihre MySQL-Version? –

+1

@ P.Alex, offensichtlich müssen Sie den anderen Auslöser löschen, bevor Sie diesen hinzufügen. – Johan

-1

DELIMITER $$ CREATE TRIGGER upd_check BEFORE UPDATE wegen FÜR JEDE REIHE BEGIN

 IF NEW.amount > 100 THEN 
      SET NEW.amount = 100 
    END END IF 
    END$$ 
    DELIMITER ; 

in diesem Code zeigt Fehler wie # 1064 - Sie haben einen Fehler in Ihrer SQL-Syntax; Überprüfen Sie das Handbuch, das zu Ihrer MariaDB-Server-Version für die richtige Syntax in der Nähe 'ENDE ENDE IF END' Zeile 7