2012-04-29 21 views
10

Mi almacenamiento es INNODB, Estoy tratando de crear un disparador con 2 consultas en la instrucción IF. Abajo se puede ver el detonante que me da el errorMysql Trigger con SI ENTONCES

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 

Estos son los 2 factores desencadenantes que i activo con el primero.

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 ; 

Pero éste funciona perfectamente

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) 

¿Cómo puedo hacer el trabajo primero gatillo? ¿Qué estoy haciendo mal? Thx por ayudarme.

+0

¿podría dar la cláusula if dos veces para cada declaración de eliminación y ver? – nawfal

+0

(Excepto por los contadores), ¿sabe que puede tener el mismo comportamiento con una restricción de clave externa (una de cada tabla) a la tabla 'video', definiendo los FK con' ON DELETE CASCADE'? –

+0

sí lo sé, pero en foreing keys los disparadores en mysql no se activan, entonces debo eliminarlos con otro disparador para que estas consultas activen otros disparadores –

Respuesta

12

Por lo que yo puedo decir los dos gatillos están bien, pero es posible que intente lo siguiente:

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

Esto es lo que obtengo -> ERROR 1235 (42000): Esta versión de MySQL doesn ' t aún admite 'múltiples activadores con el mismo tiempo de acción y evento para una sola tabla' –

+0

@ P.Alex - ¿Y cuál es su versión de MySQL? –

+1

@ P.Alex, obviamente tendrá que eliminar el otro disparador antes de agregar este. – Johan

-1

DELIMITER $$ CREATE upd_check gatillo antes ACTUALIZACIÓN SOBRE cuenta PARA CADA FILA COMENZAR

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

en este código muestra un error como # 1064 - Tiene un error en la sintaxis SQL; revise el manual que corresponde a su versión del servidor MariaDB para la sintaxis correcta para usar cerca de 'END END IF END' en la línea 7

Cuestiones relacionadas