如何避免在使用随机数据填充 table 时插入具有重复主键值的元组
How to avoid tuples with duplicate primary key values getting inserted when populating table with random data
我需要使用随机数据元组填充 table 以用于测试目的。由于依赖性原因,我需要使用 MySQL5.6。由于 MySQL5.6 没有任何序列生成器或类似功能来帮助将随机数据填充到 tables 中,因此我能够收集信息以提出基本脚本来完成相同的工作。这是该脚本:
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);
我的测试需要填充 table 以便其大小在 30GB 左右,为此我决定用 :
填充 table
CALL InsertRandomRows(10000000);
有问题的 table 将 (id,created_at) 对作为主键。
但是,在插入 1095600 行(大约是所需行数的 10%)之后,由于尝试插入与之前插入的行具有相同 (id,created_at) 对的行,查询执行停止。
为了防止这种情况,我可以对脚本进行任何修改吗?
非常感谢任何见解。
根据@Honeyboy Wilson 的评论,添加以下子句有助于解决我的错误。
........................
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;
ON DUPLICATE KEY UPDATE id=id+ROUND(RAND() * 100);
........................
我需要使用随机数据元组填充 table 以用于测试目的。由于依赖性原因,我需要使用 MySQL5.6。由于 MySQL5.6 没有任何序列生成器或类似功能来帮助将随机数据填充到 tables 中,因此我能够收集信息以提出基本脚本来完成相同的工作。这是该脚本:
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);
我的测试需要填充 table 以便其大小在 30GB 左右,为此我决定用 :
填充 tableCALL InsertRandomRows(10000000);
有问题的 table 将 (id,created_at) 对作为主键。 但是,在插入 1095600 行(大约是所需行数的 10%)之后,由于尝试插入与之前插入的行具有相同 (id,created_at) 对的行,查询执行停止。 为了防止这种情况,我可以对脚本进行任何修改吗? 非常感谢任何见解。
根据@Honeyboy Wilson 的评论,添加以下子句有助于解决我的错误。
........................
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;
ON DUPLICATE KEY UPDATE id=id+ROUND(RAND() * 100);
........................