Triggers en Mysql

Iniciado por Bhrentox, 24 Mayo 2011, 22:27 PM

0 Miembros y 1 Visitante están viendo este tema.

Bhrentox

Hola, veran tengo un problema con los llamados Triggers en mysql lo que tengo que hacer es esto:

Crear un trigger que cuente los registros de la tabla employees y mantenga ese numero actualizado en una tabla llamada cuenta, este trigger actuara después de una instrucción insert o delete ejemplo si se introduce un registro nuevo en la tabla aumentara en uno el contador, si se elimina un registro se disminuirá en uno el contador.

Estaba pensando en si se pueden hacer condiciones  anidadas en un solo trigger o alguien que sepa de esto alguna sugerencia??

Bueno ya encontre que si se pueden realizar condiciones anidadas ahora el problema es ese llamado contador como hacer que me cuente los registros de la tabla que ya tengo y que despues se vaya aumentando o disminuyendo segun sea el caso.

Salu2 y les agradezco de antemano.
"Enseñar a los niños el uso de software libre en las escuelas, formará individuos con sentido de libertad"
"Microsoft no es el diablo, sólo hacen sistemas operativos vulgares."
"No temo a los ordenadores; lo que temo es quedarme sin ellos"
"Una vez un ordenador me venció jugando al ajedrez, pero no me opuso resistencia cuando pasamos al kick boxing"

Valkyr

Pues antes de crear el trigger creas la tabla cuenta, almacenas en ella el valor de contar todos los registros con un COUNT(), luego a la hora de definir el trigger si es una inserccion aumentas en uno dicho valor, si es un delete decrementas en uno. Esa es la idea de una forma así general, ahora sería cuestión de implementarlo.

Saludos.

KuraraGNU


1. Si, se pueden anidar.

2. Como dice Bhrentox, creas la tabla cuenta primero con el count(). Despues, no hagas que automaticamente sume o reste dependiendo si se hace un insert o un delete, sino si la insercion o la supresion de una fila se ha llevado a cabo de forma correcta.

No recuerdo bien como van los triggers, soy de memoria volatil, asi que no te puedo ayudar ahora mismo en los pasos que sigue un trigger. Se que crea una tabla temporal y si ocurre lo que debe ocurrir, se pasan esos datos a la tabla (en el caso de insercion) y el delete no recuerdo. Si quieres lo busco y te lo digo, si ya sabes tu como funciona perfecto.

Bhrentox

Muchas gracias ya pude crear el trigger de esta manera

mysql> DELIMITER ||
mysql> create trigger eje_b after insert on employees2
    -> for each row
    -> begin
    -> insert into cuenta set dato=(select count(*) from employees2);
    -> END;
    -> ||
Query OK, 0 rows affected (0.01 sec)

el problema ahora esque cada vez que se ingresa un nuevo registro en la tabla de cuenta se pone una cantidad nueva es decir

primero tenia asi:

dato
23
y ahora ya va asi
dato
23
22
25
26

hay alguna forma de evitar que se acumulen y que solo ponga el dato actual segun yo debo hacer un update pero no se como realizar la sentencia espero alguien sepa salu2 y gracias por su ayuda.

"Enseñar a los niños el uso de software libre en las escuelas, formará individuos con sentido de libertad"
"Microsoft no es el diablo, sólo hacen sistemas operativos vulgares."
"No temo a los ordenadores; lo que temo es quedarme sin ellos"
"Una vez un ordenador me venció jugando al ajedrez, pero no me opuso resistencia cuando pasamos al kick boxing"

Bhrentox

#4
Bueno pues ya resolvi el problema
la solucion es esta por si despues alguien la necesita

mysql> DELIMITER ||
mysql> create trigger eje_b after insert on employees2
   -> for each row
   -> begin
   -> insert into cuenta set dato=(select count(*) from employees2);
   -> END;
   -> ||
Query OK, 0 rows affected (0.01 sec)
En donde va esta linea simplemente se le cambia a update y listo todo resuelto

-> insert into cuenta set dato=(select count(*) from employees2);
Solucion:
-> update cuenta set dato=(select count(*) from employees2);

Gracias Valkyr y KuraraGNU
"Enseñar a los niños el uso de software libre en las escuelas, formará individuos con sentido de libertad"
"Microsoft no es el diablo, sólo hacen sistemas operativos vulgares."
"No temo a los ordenadores; lo que temo es quedarme sin ellos"
"Una vez un ordenador me venció jugando al ajedrez, pero no me opuso resistencia cuando pasamos al kick boxing"