Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

trigger con update en la misma tabla

Estas en el tema de trigger con update en la misma tabla en el foro de Mysql en Foros del Web. Hola a todos, tengo un problemilla con un trigger: Código: create table bookmarks( id integer unsigned not null auto_increment, name varchar(50) not null, parent integer ...
  #1 (permalink)  
Antiguo 19/08/2008, 05:37
Avatar de caerolus  
Fecha de Ingreso: agosto-2004
Ubicación: Madrid, España
Mensajes: 280
Antigüedad: 19 años, 8 meses
Puntos: 1
trigger con update en la misma tabla

Hola a todos, tengo un problemilla con un trigger:
Código:
create table bookmarks(
	id integer unsigned not null auto_increment,
	name varchar(50) not null,
	parent integer unsigned,
	childCount integer unsigned not null,

	primary key(id)
);
delimiter |
create trigger updateChildCount after insert on bookmarks
	for each row
	begin
		if new.parent is not null then
			update bookmarks set childCount=childCount+1 where id = NEW.parent;
		end if;
	end;
|
delimiter ;
Básicamente tengo una jerarquía de bookmarks, en donde el campo 'parent' indica el bookmark padre, y 'childCount' indica cuántos hijos tiene cada bookmark.
El trigger básicamente incrementa 'childCount' del padre al insertar un nuevo bookmark. El caso es que MySQL se queja porque dice que no puedo hacer un update en la misma tabla que invoca el trigger:
Cita:
ERROR 1442 (HY000): Can't update table 'bookmarks' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
¿Alguna idea de cómo hacer esto?
__________________
Mi página personal: Julián Urbano
  #2 (permalink)  
Antiguo 19/08/2008, 06:48
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: trigger con update en la misma tabla

Tengamos en claro que los triggers son procedimientos que se "disparan" ante tres tipos de eventos: INSERT, UPDATE y DELETE. Como tales tienen restricciones:
1. No son recursivos.
2. No se pueden hacer tareas que afecten a la misma tabla que está gestionando el trigguer en curso.
3. No se puede definir más de un trigger para el mismo evento en la misma tabla.

El problema es que estás tratando de violar una restricción básica: intentas hacer un UPDATE donde estás controlando un INSERT...
Piensa eso: El motor de la base de datos sabe que se está administrando un evento INSERT pero no hay forma a priori de saber cuáles campos terminarán siendo afectados, y cómo afectará ésto a el o los índices que pueda haber, hasta que el proceso de inserción termine. Por ello te realiza un bloqueo implícito a nivel de tabla, con lo que no puedes realizar ninguna otra cosa hasta que la inserción se complete.
¿Se comprende?
La tarea que estás intentando hacer es imposible en ese contexto de restricciones y se debe realizar después de que hayas hecho la inserción y que la tabla se desbloquee.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:02.