Вставка MySQL с циклом while

Я пытаюсь создать кучу записей в моей базе данных MySQL. Это одноразовое создание, поэтому я не пытаюсь создать хранимую процедуру. Вот мой код:

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

Вот ошибка:

[ОШИБКА в запросе 1] У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'SET я = 2376921001 WHILE (i <= 237692200) DO   INSERT INTO coupon (couponCod 'в строке 2 Выполнение остановлено!

Я попробовал объявление с теми же результатами. Код ниже:

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

Еще одна вещь, которую я пробовал, - это @i, а не только я. Такая же ошибка. Может ли кто-нибудь увидеть, что я делаю неправильно?

Ответ 1

Вы не можете использовать WHILE; см. mysql DECLARE WHILE вне хранимой процедуры как?

Вы должны поместить свой код в хранимую процедуру. Пример:

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

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

В качестве альтернативы, сгенерируйте список операторов INSERT, используя любой язык программирования, который вам нравится; для одноразового создания это должно быть хорошо. Например, здесь Bash однострочный:

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

Кстати, вы сделали опечатку в своих номерах; 2376921001 имеет 10 цифр, 237692200 всего 9.

Ответ 2

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();