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.

¿Cómo puedo generar datos utilizando bucles anidados en MySQL/MariaDB? He intentado varias veces generar 100 entradas por día, pero solo se genera una vez.

DELIMITADOR $$
CREAR PROCEDIMIENTO generar_datos2()
PRINCIPIO
  DECLARE i INT DEFAULT 0;
  DECLARE j INT DEFAULT 0;
  WHILE i < 10 HACER
    WHILE j <100 HACER
        INSERTAR EN NOTIFICACIONES (id,customer_id,tos,device_type,message,types,read_status,created_at,updated_at) 
        VALORES (
        null,10000,'tos','device_type','message ','Types',1, DATE_FORMAT(DATE_SUB(now(),INTERVAL i DAY),"%Y-%m-%d %h:%m:%s"),
        DATE_FORMAT(DATE_SUB(now(),INTERVAL 2 DAY),"%Y-%m-%d"));
        SET j = j + 1; 
    FIN MIENTRAS;
    SET i = i + 1;
  FIN MIENTRAS;
FIN$$
DELIMITADOR ;

Este código no está funcionando como esperaba. Quiero generar 100 datos cada día utilizando un bucle while. Pero cada vez que se repite solo una vez durante 1 día. Si ejecutas mi código, podrás entender ese problema. Necesito una solución experta de una manera mejor.
Ejemplo:
Para el 2022-Jan-01 100 entradas
Para el 2022-Dec-31 100 entradas
Para el 2022-Dec-30 100 entradas

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que el bucle interno WHILE de j no se reinicia a 0 después de insertar correctamente 100 registros. Por lo tanto, el bucle se ejecuta solo una vez para cada valor de i.

    Para generar 100 registros para cada día, necesitamos modificar el bucle interno para que comience desde 0 y vaya hasta 99 para cada valor de i. Esto se puede lograr agregando la instrucción j = 0; antes del inicio del bucle interno:

    DELIMITER $$
    CREATE PROCEDURE generar_datos2()
    BEGIN
      DECLARE i INT DEFAULT 0;
      DECLARE j INT DEFAULT 0;
      WHILE i < 10 DO
        SET j = 0; -- Reiniciar j a 0 para cada valor de i
        WHILE j < 100 DO
          INSERT INTO notificaciones (id,customer_id,tos,device_type,message,types,read_status,created_at,updated_at) 
          VALUES (
          null,10000,'tos','device_type','message ','Types',1, DATE_FORMAT(DATE_SUB(now(),INTERVAL i DAY),'%Y-%m-%d %h:%m:%s'),
          DATE_FORMAT(DATE_SUB(now(),INTERVAL 2 DAY),'%Y-%m-%d'));
          SET j = j + 1; 
        END WHILE;
        SET i = i + 1;
      END WHILE;
    END$$
    DELIMITER ;
    

    Con esta modificación, el bucle interno se ejecutará 100 veces para cada valor de i, generando 100 registros por día como se esperaba.

Comments are closed.