Мне нужно заполнить таблицу кортежами рандомизированных данных для целей тестирования. Мне нужно работать с MySQL5.6 по причинам зависимости. Поскольку MySQL5.6 не имеет генератора последовательностей или аналогичных функций, которые бы помогали заполнять случайные данные в таблицах, я смог собрать информацию, чтобы придумать элементарный скрипт для выполнения той же работы. Вот этот скрипт:
DELIMITER $$
CREATE PROCEDURE InsertRandomRows(IN NumRows INT)
BEGIN
DECLARE i INT;
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
INSERT INTO table_name (id, tel_mobile, created_at, age,
call_time, created_at, fio, address, comment) VALUES (
ROUND(RAND() * 100000000),
ROUND(RAND() * 1000000),
FROM_UNIXTIME(
UNIX_TIMESTAMP('2010-04-30 14:53:27')
+ FLOOR(0 + (RAND() * 63072000))
),
ROUND(RAND() * 1000000),
ROUND(RAND() * 1000000),
ROUND(RAND() * 1000000),
LEFT(CONCAT(
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR ))
), 100),
LEFT(CONCAT(
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR ))
), 100),
LEFT(CONCAT(
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR )),
MD5( CAST( RAND() AS CHAR ))
), 100)
);
SET i = i + 1;
END WHILE;
COMMIT;
END$$
DELIMITER ;
CALL InsertRandomRows(100000);
Для моего тестирования потребовалось бы заполнить таблицу так, чтобы ее размер находился в пределах 30 ГБ, для чего я решил заполнить таблицу:
CALL InsertRandomRows(10000000);
В рассматриваемой таблице пара (id, made_at) используется в качестве первичного ключа.
Однако после вставки 1095600 строк (около 10% от необходимого количества строк) выполнение запроса останавливается из-за попытки вставить строку, содержащую ту же пару (id, made_at), что и ранее вставленная.
Есть ли какие-либо изменения в сценарии, которые я могу сделать, чтобы предотвратить это?
Любые идеи приветствуются.