Ver Mensaje Individual
  #8 (permalink)  
Antiguo 17/11/2010, 10:49
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: AYUDA Trigger mysql

Cita:
Lo explico con mi ejemplo: Tengo 1 tabla con datos de centros y otra con datos de citaciones. Lo que quiero hacer es que cada vez que se inserte o se actualice la tabla citaciones en la tabla centros se actualice un campo. Este campo contiene el número de citas que se han hecho a ese centro.
Allí puede convenirte un TRIGGER, pero la necesidad de ese campo en la otra tabla es absolutamente discutible.
Normalmente no se deben (por principio) almacenar datos calculables, entendiendo por tales datos que pueden obtenerse al mismo tiempo que se realizan las consultas relacionadas con esos datos, o bien datos de agregación que tienen alguna variación el el tiempo.
No es una buena práctica porque obtener esos mismos datos en una forma actualizada lleva casi el mismo tiempo que leer esa tabla, con el agregado de que un campo de acumulador requiere procesos extra (como este y otros más) para resguardar su consistencia.Y esos procesos extra implican las mismas consultas que para obtener el dato dinamicamente... lo que hace que almacenarlo termine siendo innecesario.

¿Se comprende la idea?

Bueno. Un TRIGGER que haga lo que quieres sería mas o menos así:
Código MySQL:
Ver original
  1. DELIMITER $$
  2. DROP TRIGGER IF EXISTS ACT_CENTROS ;
  3. CREATE TRIGGER ACT_CENTROS AFTER INSERT on sugartest.citas_citas_nominales
  4. UPDATE sugartest.citas_centros
  5.     SET num_ausencias = (num_ausencias + new.ausencias),
  6.     num_citas_totales=(num_citas_totales+citas_totales),
  7.     num_asistencias=(num_asistencias+NEW.asistencias)
  8. WHERE citas_centros.id=NEW.id_centro;
  9. END$$
  10. DELIMITER;
Faltaría solamente una validación para saber si el id_centro entrante existe o no en sugartest.citas_centros, y en caso contrario realizar un INSERT, o bien hacer un INSERT ... ON DUPLICATE KEY UPDATE...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)