Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: WHK en 3 Febrero 2014, 16:00 pm



Título: Duda con trigger en MySQL (after update y after insert)
Publicado por: WHK en 3 Febrero 2014, 16:00 pm
Hola, tengo una duda existencial:

Tengo una columna llamada "usuarios" con 5 columnas: id, nombres, apellidos, nombres_apellidos y apellidos_nombres.

Como se darán cuenta la idea principal es hacer que cuando se actualize el nombre o el apellido que de forma automática también se autocomplete el campo nombres_apellidos y apellidos_nombres los cuales son el resultado de la concatenación de la columna nombres y apellidos separados por un espacio en blanco.

O sea, por ejemplo si la columna nombre contiene "abc" y apellidos es "def" entonces la columna nombres_apellidos debería quedar "abc def" y apellidos nombres "def abc".

Lo hago de esta manera porque tengo muchos cientos de miles de registros y a futuro necesitaré hacer búsqueda de personas utilizando un like % sobre estas columnas para no tener que buscar en columnas separadas. Mucha gente buscará poniendo el nombre y el apellido o al revés: el apellido y el nombre y debe encontrar exactamente a la persona que busca y no aproximaciones.

Un amigo me dijo que era dificil porque si le hago un after update a la misma fila causaré un loop infinito porque se estará actualizando asi mismo y este gatillará nuevamente al mismo trigger.

Intenté hacer dos triggers uno cuando inserta y otro cuando actualiza de la siguiente manera:

Código
  1. USE `tabla`;
  2. DELIMITER $$
  3. CREATE TRIGGER `usuarios_AINS` AFTER INSERT ON `usuarios` FOR EACH ROW
  4. UPDATE `usuarios`
  5. SET
  6.    nombres_apellidos = CONCAT(TRIM(BOTH ' ' FROM nombres), ' ', TRIM(BOTH ' ' FROM apellidos)),
  7.    apellidos_nombres = CONCAT(TRIM(BOTH ' ' FROM apellidos), ' ', TRIM(BOTH ' ' FROM nombres))
  8. WHERE id = NEW.id
  9.  
  10. ----------------------------------------------------
  11.  
  12. USE `tabla`;
  13. DELIMITER $$
  14. CREATE TRIGGER `usuarios_AUPD` AFTER UPDATE ON `usuarios` FOR EACH ROW
  15. UPDATE `usuarios`
  16. SET
  17.    nombres_apellidos = CONCAT(TRIM(BOTH ' ' FROM nombres), ' ', TRIM(BOTH ' ' FROM apellidos)),
  18.    apellidos_nombres = CONCAT(TRIM(BOTH ' ' FROM apellidos), ' ', TRIM(BOTH ' ' FROM nombres))
  19. WHERE NEW.id = OLD.id

El problema es que cuando quiero actualizar la columna este me arroja un error diciendo que la tabla está ocupada con un procedure o trigger y que no se puede utilizar.

Es mi primera ves que hago un trigger (porque soy enemigo de los triggers xD) asi que me da la impresión de que yo no supe hacerlo bién.

Alguien me puede decir que alternativas tengo para hacer esto directamente desde mysql y mantener la integridad de mi tabla? ya que desde php tengo que hacer muchas condicionales sobre la clase que actualiza, registra, etc, verificar si se va a actualizar solo el nombre o solo el apellido para tomar el anterior etc para no hacer dos updates, en fin.

Gracias.


Título: Re: Duda con trigger en MySQL (after update y after insert)
Publicado por: Toxico en 4 Febrero 2014, 00:27 am
Hola, en el link http://stackoverflow.com/questions/14774220/mysql-before-update-trigger-change-value, basicamente esta la solución a tu problema, que extrapolando tu código quedaría talque así.

Código:
CREATE TRIGGER usuarios_AUPD BEFORE UPDATE ON employees FOR EACH ROW
 BEGIN

SET new.nombres_apellidos = CONCAT(TRIM(old.nombres), ' ', TRIM(old.apellidos))
SET new.apellidos_nombres = CONCAT(TRIM(old.apellidos), ' ', TRIM(old.nombres))



END$$
delimiter ;



Entiendo que la única diferencia con el tuyo es que le falta la palabra reservada new  antes de los campos a actualizar.