elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  Duda con trigger en MySQL (after update y after insert)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con trigger en MySQL (after update y after insert)  (Leído 3,983 veces)
WHK
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.328


The Hacktivism is not a crime


Ver Perfil WWW
Duda con trigger en MySQL (after update y after insert)
« en: 3 Febrero 2014, 16:00 »

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.


En línea

Telegram: @WHK102 - Semáforo Epidemiologico Chile
Toxico


Desconectado Desconectado

Mensajes: 406



Ver Perfil
Re: Duda con trigger en MySQL (after update y after insert)
« Respuesta #1 en: 4 Febrero 2014, 00:27 »

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.


« Última modificación: 4 Febrero 2014, 00:30 por Toxico » En línea

solo el principio....

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Insertar datos con un update, dentro de otro update con SQLi(Mysql)
Nivel Web
WarGhost 3 4,502 Último mensaje 23 Agosto 2011, 03:37
por WarGhost
[Solucionado] Pregunta Trigger MySql
Bases de Datos
raul_samp 0 1,811 Último mensaje 27 Marzo 2012, 17:09
por raul_samp
duda con update mysql
Desarrollo Web
xemnas 1 1,089 Último mensaje 23 Abril 2012, 13:21
por HdM
Comprobar si existe datos en mysql y si existe hacer update, si no hacer insert
Programación Visual Basic
elmatador2 1 2,239 Último mensaje 15 Abril 2015, 20:56
por rob1104
problema en trigger update status
Bases de Datos
geshiro 4 1,849 Último mensaje 30 Abril 2016, 06:25
por geshiro
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines