2012-04-29 20 views
10

Il mio spazio di archiviazione è INNODB, Sto provando a creare un trigger con 2 query nell'istruzione IF. Giù si può vedere il trigger che mi dà l'erroreMysql trigger con IF 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 

questo sono i 2 trigger che posso attivare con il primo.

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 ; 

Ma questo funziona perfettamente

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) 

Come posso fare prima opera grilletto? cosa sto facendo di sbagliato? Thx per avermi aiutato.

+0

potresti fornire la clausola if due volte per ogni istruzione delete e vedere? – nawfal

+0

(Ad eccezione dei contatori), sai che puoi avere lo stesso comportamento con un vincolo di chiave esterna (uno da ogni tabella) alla tabella 'video', definendo gli FK con' ON DELETE CASCADE'? –

+0

sì lo so, ma su trigger di chiavi di foreing in mysql non si attiva, quindi devo cancellarlo con un altro trigger così questa query attiva altri trigger –

risposta

12

Per quanto posso dire entrambi i trigger sono OK, ma si potrebbe provare la seguente:

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

Questo è quello che ottengo -> ERRORE 1235 (42000): Questa versione di MySQL non lo fa t ancora supportare 'trigger multipli con lo stesso tempo di azione ed evento per una tabella' –

+0

@ P.Alex - E qual è la tua versione di MySQL? –

+1

@ P.Alex, ovviamente dovrai cancellare l'altro trigger prima di aggiungere questo. – Johan

-1

DELIMITER $$ CREATE TRIGGER upd_check PRIMA DI AGGIORNAMENTO SULLA conto PER OGNI FILA BEGIN

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

in questo codice mostra errore come # 1064 - Si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MariaDB per la sintassi corretta da utilizzare vicino a "END END IF END" alla riga 7