web-dev-qa-db-fra.com

Insertion de MySQL avec la boucle While

J'essaie de créer un tas d'enregistrements dans ma base de données MySQL. Il s’agit d’une création unique, donc je n’essaie pas de créer une procédure stockée. Voici mon code:

BEGIN
SET i = 2376921001;
WHILE (i <= 237692200) DO
    INSERT INTO `mytable` (code, active, total) values (i, 1, 1);
    SET i = i+1;
END WHILE;
END

Voici l'erreur:

[ERREUR dans la requête 1] Vous avez une erreur dans votre syntaxe SQL; Consultez le manuel correspondant à la version de votre serveur MySQL pour connaître la syntaxe à utiliser près de 'SET i = 2376921001 Tandis que (i <= 237692200) INSERER DANS coupon (couponCod') à la ligne 2 Exécution arrêtée!

J'ai essayé un Declare avec les mêmes résultats. Code ci-dessous:

BEGIN
DECLARE i INT unsigned DEFAULT 2376921001;
WHILE (i <= 237692200) DO
    INSERT INTO `mytable` (code, active, total) values (i, 1, 1);
    SET i = i+1;
END WHILE;
END

L’autre chose que j’ai essayée est avec @i au lieu de i. Même erreur. Quelqu'un peut-il voir ce que je fais mal?

23
jessier3

Vous ne pouvez pas utiliser WHILE comme ça; voir: mysql DECLARE WHILE en dehors de la procédure stockée comment?

Vous devez mettre votre code dans une procédure stockée. Exemple:

CREATE PROCEDURE myproc()
BEGIN
    DECLARE i int DEFAULT 237692001;
    WHILE i <= 237692004 DO
        INSERT INTO mytable (code, active, total) VALUES (i, 1, 1);
        SET i = i + 1;
    END WHILE;
END

Violon: http://sqlfiddle.com/#!2/a4f92/1

Vous pouvez également générer une liste d'instructions INSERT à l'aide du langage de programmation de votre choix. pour une création unique, ça devrait aller. À titre d'exemple, voici un Bash one-liner:

for i in {2376921001..2376921099}; do echo "INSERT INTO mytable (code, active, total) VALUES ($i, 1, 1);"; done

Au fait, vous avez fait une faute de frappe dans vos chiffres; 2376921001 a 10 chiffres, 237692200 seulement 9.

21
Ruud Helderman
drop procedure if exists doWhile;
DELIMITER //  
CREATE PROCEDURE doWhile()   
BEGIN
DECLARE i INT DEFAULT 2376921001; 
WHILE (i <= 237692200) DO
    INSERT INTO `mytable` (code, active, total) values (i, 1, 1);
    SET i = i+1;
END WHILE;
END;
//  

CALL doWhile(); 
23
Lily.He