2012-08-30 14 views
6

tengo el siguiente trigger:MySQL gatillo no puede actualizar la tabla - Se obtiene un error 1442

CREATE TRIGGER sum 
AFTER INSERT 
ON news 
FOR EACH ROW 
UPDATE news SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

Se resume la columna de la int_views y ext_views de una mesa y los divide por el total de páginas vistas.

Siempre que intento agregar una nueva fila a la noticia, me sale el siguiente error:

ERROR 1442 (HY000) at line 3: Can't update table 'news' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

El disparador parece bastante simple para mí. ¿Hay alguna razón por la cual el disparador no se ejecuta?

+1

no 'condición WHERE'? – jcho360

+0

@ jcho360, lo siento, no veo dónde incluir una condición de dónde. Quiero que el desencadenador se ejecute en cada fila después de que se inserta. – egidra

+1

si eso no funciona, házmelo saber para probar con 'WHERE news_id = NEW.news_id;' al final – jcho360

Respuesta

9

El síntoma es, que está ejecutando un UPDATE (para todas las filas) en el interior de un disparador INSERT - tanto modificar la tabla, que no está permitido.

Dicho esto, si supongo que la intención de su activador es correcta, no desea actualizar todas las filas, sino solo la fila recién insertada. Se puede lograr fácilmente que con

CREATE TRIGGER sum 
BEFORE INSERT 
ON news 
FOR EACH ROW 
SET NEW.sum = (NEW.int_views + NEW.ext_views)/NEW.pageviews 

cuenta que este es un disparador BEFORE INSERT, como se desea cambiar la fila antes de que se escribe en la tabla.

+0

mismo problema para mí, solo tuve que eliminar la parte UPDATE tlb - ¡gracias! – Smith

6

Si intenta actualizar/insertar en la misma mesa que causan gatillo para disparar no utilice el comando común sql como

-> UPDATE TABLE_NAME SET COLUMN_NAME = VALUE WHERE CONDITION_LIST; 
-> INSERT INTO TABLE_NAME VALUES("VALUE1","VALUE2"); 

Esto no funcionará. Solo usa set para asignar el valor de la columna que actualizas.

Ejemplo:

CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE ON table_name 
FOR EACH ROW 
SET NEW.COLUMN_NAME = "VALUE"; 
+0

Fue una respuesta sensata y razonable. Me ayudó a resolver el error de manera apropiada. ¡Gracias! – itsraghz

Cuestiones relacionadas