MySQLにテストデータを大量に突っ込む際のベストプラクティスをまとめる。
ここら辺を参考にした。
https://qiita.com/tayasu/items/c5ddfc481d6b7cd8866d
https://qiita.com/SuguruOoki/items/8a00c237737d143a529a
create_table.sql
DROP TABLE IF EXISTS `sample`;
CREATE TABLE IF NOT EXISTS `sample` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`create_date` INTEGER NOT NULL,
`update_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;
適当に10件データを登録
insert.sql
INSERT INTO `sample` (`id`, `name`, `create_date`, `update_date`) VALUES
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP),
(NULL, SUBSTRING(MD5(RAND()), 1, 50), CEIL(RAND() * 2678400 + 1561939200), CURRENT_TIMESTAMP);
CROSS JOINでONの条件をいじることでデータを特定の量増やせる。今回は*10してみた。
複数回実行することで、データをスケールさせる。
multi.sql
INSERT INTO `sample` (`name`, `create_date`, `update_date`) SELECT T1.`name`, T1.`create_date`, T1.`update_date` from `sample` as T1 CROSS JOIN `sample` as T2 ON T2.id IN (1, 2, 3, 4, 5, 6, 7, 8, 9);