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

Insert ó update: Si existe un registro o no existe

Estas en el tema de Insert ó update: Si existe un registro o no existe en el foro de Mysql en Foros del Web. Hola CHICOS, soy nuevo en la comunidad y gracias por brindarme este espacio, les cuento que actualmente estoy haciendo una DB escolar, y como saben ...
  #1 (permalink)  
Antiguo 09/02/2011, 12:15
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 9 meses
Puntos: 0
Pregunta Insert ó update: Si existe un registro o no existe

Hola CHICOS, soy nuevo en la comunidad y gracias por brindarme este espacio, les cuento que actualmente estoy haciendo una DB escolar, y como saben las calificaciones de los estudiantes son importantes, basicamente es lo siguiente.

Creo un trigger con evento AFTER INSERT que toma todas las clificaciones asignadas a un mismo estudiante realiza un procedimiento de PROMEDIO (MEDIA) y lo enviea a otra tabla para guardar alli la nota final.

Tengo 2 Tablas:
1. Historial_calificaciones
| idHistorial | ** |idalumno| ** |califnum | ** |fecha_ingreso

2. final
| idfinal | ** |idalumno| ** |califnum| --califnum es igual a decir promedio

PERO dichas acciones dependiente de:
1. Si NO existe el id del estudiante (idalumno) entonces inserta los datos en historial_caficaciones y luego envia el promedio a final en el campo califnum simpre y cuando NO EXISTA UN REGISTRO CREADO.

2. SI EXISTE ya un estudiante (idalumno) en la tabla Historial_calificaciones simplemente realiza una actualizacion al PROMEDIO del alumno ya creado el final
es decir si existe, actualiza el promedio.

Para el promedio uso AVG(califnum) y lo selecciono por el idalumno, asi sacara el promedio de un estudiante

Para ello estoy usando un trigger que es este:

Código PHP:
DROP TRIGGER IF EXISTS `promedio`//
CREATE TRIGGER `promedioAFTER INSERT ON `tabla2`
 FOR 
EACH ROW BEGIN
 
DECLARE total_final INT(11);
 -- 
Cargo la Variable con la Cantidad de Registros 
 SET total_final 
= (SELECT COUNT(*) FROM final WHERE idalumno= NEW.idalumno GROUP BY idalumno);
                
-- 
Luego Tu codigo del If                 
                
IF 
total_final 0 THEN
     INSERT INTO 
final (idalumnocalifnumSELECT idalumnoAVG(califnum
     as 
califnum FROM tabla2 WHERE final.idalumno=NEW.idalumno GROUP BY idalumno;
  
END IF;
    IF 
total_final 0 THEN
     UPDATE 
final SET
           
final.idalumno= NEW.idalumno,
           final.
califnumAVG(califnum)
     
WHERE final.idalumno=NEW.idalumno;
  
END IF;
END
// 
Pero no funciona, quisiera que alguien me ayudase, estuve mirando otros post, pero no encotre solucion, por favor, ayuda!

-Marcos Aguilera
  #2 (permalink)  
Antiguo 09/02/2011, 12:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Insert ó update: Si existe un registro o no existe

si tu ejecutas esta consulta

Código MySQL:
Ver original
  1. SELECT idalumno, AVG(califnum)  
  2.      as califnum FROM tabla2 WHERE final.idalumno='el id del alumno'

cuantos registros te dan? siempre será uno?

yo lo probaría cargando una variable promedio con la consulta por fuera. Tal como lo haces con el count. Y en el insert y update pasar esta variable a las sentencias insert y update.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/02/2011, 21:11
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 9 meses
Puntos: 0
Busqueda Respuesta: Insert ó update: Si existe un registro o no existe

GRACIAS AMIGO POR TU RESPUESTA,

Al hacer la prueba que me indicas ME RESULTA 1 SOLO PROMEDIO, EL DEL idalumno ingresado, por ejemplo el 4, toma todos los registros de y me muestra

AVG(califnum) = 0,84, hasta alli va todo bien, pero como paso la variable que me indicas?

  #4 (permalink)  
Antiguo 10/02/2011, 13:58
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Insert ó update: Si existe un registro o no existe

pon los errores que se te presenten en este medio.

a nivel de logica lo veo bien... pero es necesario que parte está generando error.

saluods
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 10/02/2011, 17:57
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Insert ó update: Si existe un registro o no existe

Hola Suceden 2 cosas, si al insertar el idlaumno ya existe, e.g: intente agregar un registro nuevo a un idalumno = 4 con la calificacion 1.3, aparece el siguiente error: ES DECIR INTENTA ACTUALIZAR
Código MySQL:
Ver original
  1. SQL query:
  2.  
  3. INSERT INTO  `test`.`tabla1` (
  4.  
  5. `id` ,
  6. `califnum` ,
  7. `calificacion` ,
  8. `alumno`
  9. )
  10. NULL ,  '0.00',  'En Progreso',  '4'
  11. )
  12. MySQL said:
  13.  
  14. #1111 - Invalid use of group function

Por otro lado si no existe, entonces aparece:
Código MySQL:
Ver original
  1. 1 row(s) inserted.
  2. Inserted row id: 17

PERO NO REALIZA EL CALCULO O ME INSERTA EL PROMEDIO
  #6 (permalink)  
Antiguo 10/02/2011, 18:12
 
Fecha de Ingreso: febrero-2011
Mensajes: 4
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Insert ó update: Si existe un registro o no existe

Amigo, tambien he probado con esto


Código MySQL:
Ver original
  1. DROP TRIGGER IF EXISTS `promedio`//
  2. CREATE TRIGGER `promedio` AFTER INSERT ON `tabla2`
  3.  DECLARE total_final INT(11);
  4.  -- Cargo la Variable con la Cantidad de Registros  
  5.  SET total_final = (SELECT COUNT(*) FROM final WHERE idalumno= NEW.idalumno GROUP BY idalumno);
  6.  DECLARE avg INT(11);
  7.   SET avg_alumno = (SELECT AVG(califnum) FROM final WHERE idalumno = NEW.idalumno GROUP BY idalumno);              
  8. -- Luego Tu codigo del If                  
  9.                  
  10. IF total_final = 0 THEN
  11.      INSERT INTO final (idalumno, califnum) SELECT idalumno, AVG(califnum)  
  12.      as califnum FROM tabla2 WHERE final.idalumno=NEW.idalumno GROUP BY idalumno;
  13.   END IF;
  14.     IF total_final > 0 THEN
  15.      UPDATE final SET
  16.            final.idalumno= NEW.idalumno,
  17.            final.califnum= avg_alumno
  18.      WHERE final.idalumno=NEW.idalumno;
  19.   END IF;
  20. //


y no me da resultado!, quiza sea en al sintaxis, me arroja este error:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE avg INT(11);
SET avg_alumno = (SELECT AVG(califnum) FROM final WHERE ' at line 6

Etiquetas: avg, trigger
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 10:57.