es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Trigger que inserta múltiples filas en una nueva tabla

Estoy tratando de averiguar cómo puedo crear un disparador que inserte múltiples filas en otra tabla, no solo una vez.

Tengo 4 tablas –> Estudiante, Clase, Tarea, AsignacionClase

Estudiante:
ID INT, CLASSID (CLAVE EXTERNA, referencia a clase(ID))
Clase:
ID INT
Tarea:
ID
AsignacionClase (es una tabla puente) de Clase y Tarea.

Deseo que cada vez que se inserte una nueva fila en ‘AsignacionClase’, PARA CADA ESTUDIANTE que tenga este ‘ClassID’, se inserte en otra tabla llamada SolucionAsignacionEstudiante, el studentID y el assignmentID (ambos de esta fila insertada).

create trigger nuevaAsignacionClase after insert on asignacionclase
for each row
insert into SolucionAsignacionEstudiante(studentID, assignmentID)
values((select id from estudiante where classID = new.classID), new.assignmentID);

Lo que no sé cómo hacer, es cómo hacer que el desencadenador inserte múltiples filas en otra tabla, no solo una vez.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr la inserción de múltiples filas en otra tabla desde el disparador, puedes utilizar un bucle para iterar a través de todos los estudiantes con el mismo ClassID e insertar su respectivo studentID y assignmentID en la tabla StudentAssignmentSolution. Aquí tienes un ejemplo:

    CREATE TRIGGER newClassAssignment 
    AFTER INSERT ON ClassAssignment 
    FOR EACH ROW 
    BEGIN
        DECLARE studentID INT;
        DECLARE finished INTEGER DEFAULT 0;
        DECLARE cur CURSOR FOR SELECT ID FROM Student WHERE ClassID = NEW.ClassID;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
    
        OPEN cur;
        read_loop: LOOP
            FETCH cur INTO studentID;
            IF finished = 1 THEN
                LEAVE read_loop;
            END IF;
            INSERT INTO StudentAssignmentSolution (studentID, assignmentID) 
            VALUES (studentID, NEW.assignmentID);
        END LOOP;
        CLOSE cur;
    END;
    

    Este disparador recorrerá a través de todos los estudiantes con el mismo ClassID que la fila recién insertada en ClassAssignment y insertará su respectivo studentID y assignmentID en la tabla StudentAssignmentSolution.

Comments are closed.